Home | History | Annotate | Download | only in codec
      1 // Copyright 2014 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 #ifndef CORE_FXCODEC_CODEC_CCODEC_PROGRESSIVEDECODER_H_
      8 #define CORE_FXCODEC_CODEC_CCODEC_PROGRESSIVEDECODER_H_
      9 
     10 #include <vector>
     11 
     12 #include "core/fxcodec/codec/icodec_bmpmodule.h"
     13 #include "core/fxcodec/codec/icodec_gifmodule.h"
     14 #include "core/fxcodec/codec/icodec_pngmodule.h"
     15 #include "core/fxcodec/codec/icodec_tiffmodule.h"
     16 #include "core/fxcodec/fx_codec_def.h"
     17 #include "core/fxcrt/cfx_retain_ptr.h"
     18 #include "core/fxcrt/fx_system.h"
     19 #include "core/fxge/fx_dib.h"
     20 
     21 class CCodec_JpegModule;
     22 class CCodec_ModuleMgr;
     23 class CFX_DIBAttribute;
     24 class IFX_SeekableReadStream;
     25 class IFX_Pause;
     26 struct FXJPEG_Context;
     27 
     28 class CCodec_ProgressiveDecoder : public ICodec_BmpModule::Delegate,
     29                                   public ICodec_GifModule::Delegate,
     30                                   public ICodec_PngModule::Delegate {
     31  public:
     32   enum FXCodec_Format {
     33     FXCodec_Invalid = 0,
     34     FXCodec_1bppGray = 0x101,
     35     FXCodec_1bppRgb = 0x001,
     36     FXCodec_8bppGray = 0x108,
     37     FXCodec_8bppRgb = 0x008,
     38     FXCodec_Rgb = 0x018,
     39     FXCodec_Rgb32 = 0x020,
     40     FXCodec_Argb = 0x220,
     41     FXCodec_Cmyk = 0x120
     42   };
     43 
     44   explicit CCodec_ProgressiveDecoder(CCodec_ModuleMgr* pCodecMgr);
     45   virtual ~CCodec_ProgressiveDecoder();
     46 
     47   FXCODEC_STATUS LoadImageInfo(
     48       const CFX_RetainPtr<IFX_SeekableReadStream>& pFile,
     49       FXCODEC_IMAGE_TYPE imageType,
     50       CFX_DIBAttribute* pAttribute,
     51       bool bSkipImageTypeCheck);
     52 
     53   FXCODEC_IMAGE_TYPE GetType() const { return m_imagType; }
     54   int32_t GetWidth() const { return m_SrcWidth; }
     55   int32_t GetHeight() const { return m_SrcHeight; }
     56   int32_t GetNumComponents() const { return m_SrcComponents; }
     57   int32_t GetBPC() const { return m_SrcBPC; }
     58   void SetClipBox(FX_RECT* clip);
     59 
     60   FXCODEC_STATUS GetFrames(int32_t& frames, IFX_Pause* pPause = nullptr);
     61   FXCODEC_STATUS StartDecode(CFX_DIBitmap* pDIBitmap,
     62                              int start_x,
     63                              int start_y,
     64                              int size_x,
     65                              int size_y,
     66                              int32_t frames = 0,
     67                              bool bInterpol = true);
     68 
     69   FXCODEC_STATUS ContinueDecode(IFX_Pause* pPause = nullptr);
     70 
     71   struct PixelWeight {
     72     int m_SrcStart;
     73     int m_SrcEnd;
     74     int m_Weights[1];
     75   };
     76 
     77   class CFXCODEC_WeightTable {
     78    public:
     79     CFXCODEC_WeightTable();
     80     ~CFXCODEC_WeightTable();
     81 
     82     void Calc(int dest_len,
     83               int dest_min,
     84               int dest_max,
     85               int src_len,
     86               int src_min,
     87               int src_max,
     88               bool bInterpol);
     89     PixelWeight* GetPixelWeight(int pixel) {
     90       return reinterpret_cast<PixelWeight*>(m_pWeightTables.data() +
     91                                             (pixel - m_DestMin) * m_ItemSize);
     92     }
     93 
     94     int m_DestMin;
     95     int m_ItemSize;
     96     std::vector<uint8_t> m_pWeightTables;
     97   };
     98 
     99   class CFXCODEC_HorzTable {
    100    public:
    101     CFXCODEC_HorzTable();
    102     ~CFXCODEC_HorzTable();
    103 
    104     void Calc(int dest_len, int src_len, bool bInterpol);
    105     PixelWeight* GetPixelWeight(int pixel) {
    106       return reinterpret_cast<PixelWeight*>(m_pWeightTables.data() +
    107                                             pixel * m_ItemSize);
    108     }
    109 
    110     int m_ItemSize;
    111     std::vector<uint8_t> m_pWeightTables;
    112   };
    113 
    114   class CFXCODEC_VertTable {
    115    public:
    116     CFXCODEC_VertTable();
    117     ~CFXCODEC_VertTable();
    118 
    119     void Calc(int dest_len, int src_len);
    120     PixelWeight* GetPixelWeight(int pixel) {
    121       return reinterpret_cast<PixelWeight*>(m_pWeightTables.data() +
    122                                             pixel * m_ItemSize);
    123     }
    124     int m_ItemSize;
    125     std::vector<uint8_t> m_pWeightTables;
    126   };
    127 
    128   CFX_RetainPtr<IFX_SeekableReadStream> m_pFile;
    129   CCodec_ModuleMgr* m_pCodecMgr;
    130   FXJPEG_Context* m_pJpegContext;
    131   FXPNG_Context* m_pPngContext;
    132   FXGIF_Context* m_pGifContext;
    133   FXBMP_Context* m_pBmpContext;
    134   CCodec_TiffContext* m_pTiffContext;
    135   FXCODEC_IMAGE_TYPE m_imagType;
    136   uint32_t m_offSet;
    137   uint8_t* m_pSrcBuf;
    138   uint32_t m_SrcSize;
    139   uint8_t* m_pDecodeBuf;
    140   int m_ScanlineSize;
    141   CFX_DIBitmap* m_pDeviceBitmap;
    142   bool m_bInterpol;
    143   CFXCODEC_WeightTable m_WeightHorz;
    144   CFXCODEC_VertTable m_WeightVert;
    145   CFXCODEC_HorzTable m_WeightHorzOO;
    146   int m_SrcWidth;
    147   int m_SrcHeight;
    148   int m_SrcComponents;
    149   int m_SrcBPC;
    150   FX_RECT m_clipBox;
    151   int m_startX;
    152   int m_startY;
    153   int m_sizeX;
    154   int m_sizeY;
    155   int m_TransMethod;
    156   FX_ARGB* m_pSrcPalette;
    157   int m_SrcPaletteNumber;
    158   int m_SrcRow;
    159   FXCodec_Format m_SrcFormat;
    160   int m_SrcPassNumber;
    161   int m_FrameNumber;
    162   int m_FrameCur;
    163   int m_GifBgIndex;
    164   uint8_t* m_pGifPalette;
    165   int32_t m_GifPltNumber;
    166   int m_GifTransIndex;
    167   FX_RECT m_GifFrameRect;
    168   bool m_BmpIsTopBottom;
    169   FXCODEC_STATUS m_status;
    170 
    171   // ICodec_PngModule::Delegate
    172   bool PngReadHeader(int width,
    173                      int height,
    174                      int bpc,
    175                      int pass,
    176                      int* color_type,
    177                      double* gamma) override;
    178   bool PngAskScanlineBuf(int line, uint8_t*& src_buf) override;
    179   void PngFillScanlineBufCompleted(int pass, int line) override;
    180 
    181   // ICodec_GifModule::Delegate
    182   void GifRecordCurrentPosition(uint32_t& cur_pos) override;
    183   uint8_t* GifAskLocalPaletteBuf(int32_t frame_num, int32_t pal_size) override;
    184   bool GifInputRecordPositionBuf(uint32_t rcd_pos,
    185                                  const FX_RECT& img_rc,
    186                                  int32_t pal_num,
    187                                  void* pal_ptr,
    188                                  int32_t delay_time,
    189                                  bool user_input,
    190                                  int32_t trans_index,
    191                                  int32_t disposal_method,
    192                                  bool interlace) override;
    193   void GifReadScanline(int32_t row_num, uint8_t* row_buf) override;
    194 
    195   // ICodec_BmpModule::Delegate
    196   bool BmpInputImagePositionBuf(uint32_t rcd_pos) override;
    197   void BmpReadScanline(int32_t row_num, uint8_t* row_buf) override;
    198 
    199  protected:
    200   bool BmpReadMoreData(ICodec_BmpModule* pBmpModule,
    201                        FXCODEC_STATUS& err_status);
    202   bool GifReadMoreData(ICodec_GifModule* pGifModule,
    203                        FXCODEC_STATUS& err_status);
    204   void GifDoubleLineResampleVert(CFX_DIBitmap* pDeviceBitmap,
    205                                  double scale_y,
    206                                  int des_row);
    207   void PngOneOneMapResampleHorz(CFX_DIBitmap* pDeviceBitmap,
    208                                 int32_t des_line,
    209                                 uint8_t* src_scan,
    210                                 FXCodec_Format src_format);
    211   bool DetectImageType(FXCODEC_IMAGE_TYPE imageType,
    212                        CFX_DIBAttribute* pAttribute);
    213   void GetDownScale(int& down_scale);
    214   void GetTransMethod(FXDIB_Format des_format, FXCodec_Format src_format);
    215   void ReSampleScanline(CFX_DIBitmap* pDeviceBitmap,
    216                         int32_t des_line,
    217                         uint8_t* src_scan,
    218                         FXCodec_Format src_format);
    219   void Resample(CFX_DIBitmap* pDeviceBitmap,
    220                 int32_t src_line,
    221                 uint8_t* src_scan,
    222                 FXCodec_Format src_format);
    223   void ResampleVert(CFX_DIBitmap* pDeviceBitmap, double scale_y, int des_row);
    224   bool JpegReadMoreData(CCodec_JpegModule* pJpegModule,
    225                         FXCODEC_STATUS& err_status);
    226   void ResampleVertBT(CFX_DIBitmap* pDeviceBitmap, double scale_y, int des_row);
    227 };
    228 
    229 #endif  // CORE_FXCODEC_CODEC_CCODEC_PROGRESSIVEDECODER_H_
    230