Home | History | Annotate | Download | only in jbig2
      1 // Copyright 2015 PDFium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
      6 
      7 #include "core/fxcodec/jbig2/JBig2_HtrdProc.h"
      8 
      9 #include <memory>
     10 
     11 #include "core/fxcodec/jbig2/JBig2_GsidProc.h"
     12 #include "core/fxcrt/fx_basic.h"
     13 #include "third_party/base/ptr_util.h"
     14 
     15 CJBig2_Image* CJBig2_HTRDProc::decode_Arith(CJBig2_ArithDecoder* pArithDecoder,
     16                                             JBig2ArithCtx* gbContext,
     17                                             IFX_Pause* pPause) {
     18   uint32_t ng, mg;
     19   int32_t x, y;
     20   uint32_t HBPP;
     21   uint32_t* GI;
     22   std::unique_ptr<CJBig2_Image> HSKIP;
     23   std::unique_ptr<CJBig2_Image> HTREG(new CJBig2_Image(HBW, HBH));
     24   HTREG->fill(HDEFPIXEL);
     25   if (HENABLESKIP == 1) {
     26     HSKIP = pdfium::MakeUnique<CJBig2_Image>(HGW, HGH);
     27     for (mg = 0; mg < HGH; mg++) {
     28       for (ng = 0; ng < HGW; ng++) {
     29         x = (HGX + mg * HRY + ng * HRX) >> 8;
     30         y = (HGY + mg * HRX - ng * HRY) >> 8;
     31         if ((x + HPW <= 0) | (x >= (int32_t)HBW) | (y + HPH <= 0) |
     32             (y >= (int32_t)HPH)) {
     33           HSKIP->setPixel(ng, mg, 1);
     34         } else {
     35           HSKIP->setPixel(ng, mg, 0);
     36         }
     37       }
     38     }
     39   }
     40   HBPP = 1;
     41   while ((uint32_t)(1 << HBPP) < HNUMPATS) {
     42     HBPP++;
     43   }
     44   std::unique_ptr<CJBig2_GSIDProc> pGID(new CJBig2_GSIDProc());
     45   pGID->GSMMR = HMMR;
     46   pGID->GSW = HGW;
     47   pGID->GSH = HGH;
     48   pGID->GSBPP = (uint8_t)HBPP;
     49   pGID->GSUSESKIP = HENABLESKIP;
     50   pGID->GSKIP = HSKIP.get();
     51   pGID->GSTEMPLATE = HTEMPLATE;
     52   GI = pGID->decode_Arith(pArithDecoder, gbContext, pPause);
     53   if (!GI)
     54     return nullptr;
     55 
     56   for (mg = 0; mg < HGH; mg++) {
     57     for (ng = 0; ng < HGW; ng++) {
     58       x = (HGX + mg * HRY + ng * HRX) >> 8;
     59       y = (HGY + mg * HRX - ng * HRY) >> 8;
     60       uint32_t pat_index = GI[mg * HGW + ng];
     61       if (pat_index >= HNUMPATS) {
     62         pat_index = HNUMPATS - 1;
     63       }
     64       HTREG->composeFrom(x, y, HPATS[pat_index], HCOMBOP);
     65     }
     66   }
     67   FX_Free(GI);
     68   return HTREG.release();
     69 }
     70 
     71 CJBig2_Image* CJBig2_HTRDProc::decode_MMR(CJBig2_BitStream* pStream,
     72                                           IFX_Pause* pPause) {
     73   uint32_t ng, mg;
     74   int32_t x, y;
     75   uint32_t* GI;
     76   std::unique_ptr<CJBig2_Image> HTREG(new CJBig2_Image(HBW, HBH));
     77   HTREG->fill(HDEFPIXEL);
     78   uint32_t HBPP = 1;
     79   while ((uint32_t)(1 << HBPP) < HNUMPATS) {
     80     HBPP++;
     81   }
     82   std::unique_ptr<CJBig2_GSIDProc> pGID(new CJBig2_GSIDProc());
     83   pGID->GSMMR = HMMR;
     84   pGID->GSW = HGW;
     85   pGID->GSH = HGH;
     86   pGID->GSBPP = (uint8_t)HBPP;
     87   pGID->GSUSESKIP = 0;
     88   GI = pGID->decode_MMR(pStream, pPause);
     89   if (!GI)
     90     return nullptr;
     91 
     92   for (mg = 0; mg < HGH; mg++) {
     93     for (ng = 0; ng < HGW; ng++) {
     94       x = (HGX + mg * HRY + ng * HRX) >> 8;
     95       y = (HGY + mg * HRX - ng * HRY) >> 8;
     96       uint32_t pat_index = GI[mg * HGW + ng];
     97       if (pat_index >= HNUMPATS) {
     98         pat_index = HNUMPATS - 1;
     99       }
    100       HTREG->composeFrom(x, y, HPATS[pat_index], HCOMBOP);
    101     }
    102   }
    103   FX_Free(GI);
    104   return HTREG.release();
    105 }
    106