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_SRC_FXCODEC_CODEC_CODEC_INT_H_
      8 #define CORE_SRC_FXCODEC_CODEC_CODEC_INT_H_
      9 
     10 #include <limits.h>
     11 
     12 #include <list>
     13 #include <map>
     14 #include <memory>
     15 
     16 #include "core/include/fxcodec/fx_codec.h"
     17 #include "core/src/fxcodec/jbig2/JBig2_Context.h"
     18 #include "third_party/libopenjpeg20/openjpeg.h"  // For OPJ_SIZE_T.
     19 
     20 class CFX_IccProfileCache;
     21 class CFX_IccTransformCache;
     22 class CPDF_ColorSpace;
     23 
     24 class CCodec_BasicModule : public ICodec_BasicModule {
     25  public:
     26   // ICodec_BasicModule:
     27   FX_BOOL RunLengthEncode(const uint8_t* src_buf,
     28                           FX_DWORD src_size,
     29                           uint8_t*& dest_buf,
     30                           FX_DWORD& dest_size) override;
     31   FX_BOOL A85Encode(const uint8_t* src_buf,
     32                     FX_DWORD src_size,
     33                     uint8_t*& dest_buf,
     34                     FX_DWORD& dest_size) override;
     35   ICodec_ScanlineDecoder* CreateRunLengthDecoder(const uint8_t* src_buf,
     36                                                  FX_DWORD src_size,
     37                                                  int width,
     38                                                  int height,
     39                                                  int nComps,
     40                                                  int bpc) override;
     41 };
     42 
     43 class CCodec_ScanlineDecoder : public ICodec_ScanlineDecoder {
     44  public:
     45   CCodec_ScanlineDecoder();
     46   ~CCodec_ScanlineDecoder() override;
     47 
     48   // ICodec_ScanlineDecoder
     49   FX_DWORD GetSrcOffset() override { return -1; }
     50   void DownScale(int dest_width, int dest_height) override;
     51   const uint8_t* GetScanline(int line) override;
     52   FX_BOOL SkipToScanline(int line, IFX_Pause* pPause) override;
     53   int GetWidth() override { return m_OutputWidth; }
     54   int GetHeight() override { return m_OutputHeight; }
     55   int CountComps() override { return m_nComps; }
     56   int GetBPC() override { return m_bpc; }
     57   FX_BOOL IsColorTransformed() override { return m_bColorTransformed; }
     58   void ClearImageData() override { m_pDataCache.reset(); }
     59 
     60  protected:
     61   class ImageDataCache {
     62    public:
     63     ImageDataCache(int width, int height, FX_DWORD pitch);
     64     ~ImageDataCache();
     65 
     66     bool AllocateCache();
     67     void AppendLine(const uint8_t* line);
     68 
     69     int NumLines() const { return m_nCachedLines; }
     70     const uint8_t* GetLine(int line) const;
     71     bool IsSameDimensions(int width, int height) const {
     72       return width == m_Width && height == m_Height;
     73     }
     74 
     75    private:
     76     bool IsValid() const { return m_Data.get() != nullptr; }
     77 
     78     const int m_Width;
     79     const int m_Height;
     80     const FX_DWORD m_Pitch;
     81     int m_nCachedLines;
     82     std::unique_ptr<uint8_t, FxFreeDeleter> m_Data;
     83   };
     84 
     85   virtual FX_BOOL v_Rewind() = 0;
     86   virtual uint8_t* v_GetNextLine() = 0;
     87   virtual void v_DownScale(int dest_width, int dest_height) = 0;
     88 
     89   uint8_t* ReadNextLine();
     90 
     91   int m_OrigWidth;
     92   int m_OrigHeight;
     93   int m_DownScale;
     94   int m_OutputWidth;
     95   int m_OutputHeight;
     96   int m_nComps;
     97   int m_bpc;
     98   FX_DWORD m_Pitch;
     99   FX_BOOL m_bColorTransformed;
    100   int m_NextLine;
    101   uint8_t* m_pLastScanline;
    102   std::unique_ptr<ImageDataCache> m_pDataCache;
    103 };
    104 
    105 class CCodec_FaxModule : public ICodec_FaxModule {
    106  public:
    107   // ICodec_FaxModule:
    108   ICodec_ScanlineDecoder* CreateDecoder(const uint8_t* src_buf,
    109                                         FX_DWORD src_size,
    110                                         int width,
    111                                         int height,
    112                                         int K,
    113                                         FX_BOOL EndOfLine,
    114                                         FX_BOOL EncodedByteAlign,
    115                                         FX_BOOL BlackIs1,
    116                                         int Columns,
    117                                         int Rows) override;
    118   FX_BOOL Encode(const uint8_t* src_buf,
    119                  int width,
    120                  int height,
    121                  int pitch,
    122                  uint8_t*& dest_buf,
    123                  FX_DWORD& dest_size) override;
    124 };
    125 
    126 class CCodec_FlateModule : public ICodec_FlateModule {
    127  public:
    128   virtual ICodec_ScanlineDecoder* CreateDecoder(const uint8_t* src_buf,
    129                                                 FX_DWORD src_size,
    130                                                 int width,
    131                                                 int height,
    132                                                 int nComps,
    133                                                 int bpc,
    134                                                 int predictor,
    135                                                 int Colors,
    136                                                 int BitsPerComponent,
    137                                                 int Columns);
    138   virtual FX_DWORD FlateOrLZWDecode(FX_BOOL bLZW,
    139                                     const uint8_t* src_buf,
    140                                     FX_DWORD src_size,
    141                                     FX_BOOL bEarlyChange,
    142                                     int predictor,
    143                                     int Colors,
    144                                     int BitsPerComponent,
    145                                     int Columns,
    146                                     FX_DWORD estimated_size,
    147                                     uint8_t*& dest_buf,
    148                                     FX_DWORD& dest_size);
    149   virtual FX_BOOL Encode(const uint8_t* src_buf,
    150                          FX_DWORD src_size,
    151                          int predictor,
    152                          int Colors,
    153                          int BitsPerComponent,
    154                          int Columns,
    155                          uint8_t*& dest_buf,
    156                          FX_DWORD& dest_size);
    157   virtual FX_BOOL Encode(const uint8_t* src_buf,
    158                          FX_DWORD src_size,
    159                          uint8_t*& dest_buf,
    160                          FX_DWORD& dest_size);
    161 };
    162 
    163 class CCodec_JpegModule : public ICodec_JpegModule {
    164  public:
    165   CCodec_JpegModule() {}
    166   ICodec_ScanlineDecoder* CreateDecoder(const uint8_t* src_buf,
    167                                         FX_DWORD src_size,
    168                                         int width,
    169                                         int height,
    170                                         int nComps,
    171                                         FX_BOOL ColorTransform) override;
    172   FX_BOOL LoadInfo(const uint8_t* src_buf,
    173                    FX_DWORD src_size,
    174                    int& width,
    175                    int& height,
    176                    int& num_components,
    177                    int& bits_per_components,
    178                    FX_BOOL& color_transform,
    179                    uint8_t** icc_buf_ptr,
    180                    FX_DWORD* icc_length) override;
    181   FX_BOOL Encode(const CFX_DIBSource* pSource,
    182                  uint8_t*& dest_buf,
    183                  FX_STRSIZE& dest_size,
    184                  int quality,
    185                  const uint8_t* icc_buf,
    186                  FX_DWORD icc_length) override;
    187   void* Start() override;
    188   void Finish(void* pContext) override;
    189   void Input(void* pContext,
    190              const uint8_t* src_buf,
    191              FX_DWORD src_size) override;
    192 #ifndef PDF_ENABLE_XFA
    193   int ReadHeader(void* pContext, int* width, int* height, int* nComps) override;
    194 #else   // PDF_ENABLE_XFA
    195   int ReadHeader(void* pContext,
    196                  int* width,
    197                  int* height,
    198                  int* nComps,
    199                  CFX_DIBAttribute* pAttribute) override;
    200 #endif  // PDF_ENABLE_XFA
    201   int StartScanline(void* pContext, int down_scale) override;
    202   FX_BOOL ReadScanline(void* pContext, uint8_t* dest_buf) override;
    203   FX_DWORD GetAvailInput(void* pContext, uint8_t** avail_buf_ptr) override;
    204 };
    205 
    206 #ifdef PDF_ENABLE_XFA
    207 #define PNG_ERROR_SIZE 256
    208 class CCodec_PngModule : public ICodec_PngModule {
    209  public:
    210   CCodec_PngModule() { FXSYS_memset(m_szLastError, '\0', PNG_ERROR_SIZE); }
    211 
    212   virtual void* Start(void* pModule);
    213   virtual void Finish(void* pContext);
    214   virtual FX_BOOL Input(void* pContext,
    215                         const uint8_t* src_buf,
    216                         FX_DWORD src_size,
    217                         CFX_DIBAttribute* pAttribute);
    218 
    219  protected:
    220   FX_CHAR m_szLastError[PNG_ERROR_SIZE];
    221 };
    222 class CCodec_GifModule : public ICodec_GifModule {
    223  public:
    224   CCodec_GifModule() { FXSYS_memset(m_szLastError, '\0', 256); }
    225   virtual void* Start(void* pModule);
    226   virtual void Finish(void* pContext);
    227   virtual FX_DWORD GetAvailInput(void* pContext, uint8_t** avail_buf_ptr);
    228   virtual void Input(void* pContext, const uint8_t* src_buf, FX_DWORD src_size);
    229 
    230   virtual int32_t ReadHeader(void* pContext,
    231                              int* width,
    232                              int* height,
    233                              int* pal_num,
    234                              void** pal_pp,
    235                              int* bg_index,
    236                              CFX_DIBAttribute* pAttribute);
    237 
    238   virtual int32_t LoadFrameInfo(void* pContext, int* frame_num);
    239 
    240   virtual int32_t LoadFrame(void* pContext,
    241                             int frame_num,
    242                             CFX_DIBAttribute* pAttribute);
    243 
    244  protected:
    245   FX_CHAR m_szLastError[256];
    246 };
    247 class CCodec_BmpModule : public ICodec_BmpModule {
    248  public:
    249   CCodec_BmpModule() { FXSYS_memset(m_szLastError, 0, sizeof(m_szLastError)); }
    250   void* Start(void* pModule) override;
    251   void Finish(void* pContext) override;
    252   FX_DWORD GetAvailInput(void* pContext, uint8_t** avail_buf_ptr) override;
    253   void Input(void* pContext,
    254              const uint8_t* src_buf,
    255              FX_DWORD src_size) override;
    256   int32_t ReadHeader(void* pContext,
    257                      int32_t* width,
    258                      int32_t* height,
    259                      FX_BOOL* tb_flag,
    260                      int32_t* components,
    261                      int32_t* pal_num,
    262                      FX_DWORD** pal_pp,
    263                      CFX_DIBAttribute* pAttribute) override;
    264   int32_t LoadImage(void* pContext) override;
    265 
    266  protected:
    267   FX_CHAR m_szLastError[256];
    268 };
    269 #endif  // PDF_ENABLE_XFA
    270 
    271 class CCodec_IccModule : public ICodec_IccModule {
    272  public:
    273   ~CCodec_IccModule() override;
    274 
    275   // ICodec_IccModule:
    276   IccCS GetProfileCS(const uint8_t* pProfileData,
    277                      unsigned int dwProfileSize) override;
    278   IccCS GetProfileCS(IFX_FileRead* pFile) override;
    279   void* CreateTransform(ICodec_IccModule::IccParam* pInputParam,
    280                         ICodec_IccModule::IccParam* pOutputParam,
    281                         ICodec_IccModule::IccParam* pProofParam = NULL,
    282                         FX_DWORD dwIntent = Icc_INTENT_PERCEPTUAL,
    283                         FX_DWORD dwFlag = Icc_FLAGS_DEFAULT,
    284                         FX_DWORD dwPrfIntent = Icc_INTENT_ABSOLUTE_COLORIMETRIC,
    285                         FX_DWORD dwPrfFlag = Icc_FLAGS_SOFTPROOFING) override;
    286   void* CreateTransform_sRGB(
    287       const uint8_t* pProfileData,
    288       FX_DWORD dwProfileSize,
    289       int32_t& nComponents,
    290       int32_t intent = 0,
    291       FX_DWORD dwSrcFormat = Icc_FORMAT_DEFAULT) override;
    292   void* CreateTransform_CMYK(
    293       const uint8_t* pSrcProfileData,
    294       FX_DWORD dwSrcProfileSize,
    295       int32_t& nSrcComponents,
    296       const uint8_t* pDstProfileData,
    297       FX_DWORD dwDstProfileSize,
    298       int32_t intent = 0,
    299       FX_DWORD dwSrcFormat = Icc_FORMAT_DEFAULT,
    300       FX_DWORD dwDstFormat = Icc_FORMAT_DEFAULT) override;
    301   void DestroyTransform(void* pTransform) override;
    302   void Translate(void* pTransform,
    303                  FX_FLOAT* pSrcValues,
    304                  FX_FLOAT* pDestValues) override;
    305   void TranslateScanline(void* pTransform,
    306                          uint8_t* pDest,
    307                          const uint8_t* pSrc,
    308                          int pixels) override;
    309   void SetComponents(FX_DWORD nComponents) override {
    310     m_nComponents = nComponents;
    311   }
    312 
    313  protected:
    314   enum Icc_CLASS {
    315     Icc_CLASS_INPUT = 0,
    316     Icc_CLASS_OUTPUT,
    317     Icc_CLASS_PROOF,
    318     Icc_CLASS_MAX
    319   };
    320   void* CreateProfile(ICodec_IccModule::IccParam* pIccParam,
    321                       Icc_CLASS ic,
    322                       CFX_BinaryBuf* pTransformKey);
    323 
    324   FX_DWORD m_nComponents;
    325   std::map<CFX_ByteString, CFX_IccTransformCache*> m_MapTranform;
    326   std::map<CFX_ByteString, CFX_IccProfileCache*> m_MapProfile;
    327 };
    328 
    329 class CCodec_JpxModule : public ICodec_JpxModule {
    330  public:
    331   CCodec_JpxModule();
    332   ~CCodec_JpxModule() override;
    333 
    334   // ICodec_JpxModule:
    335   CJPX_Decoder* CreateDecoder(const uint8_t* src_buf,
    336                               FX_DWORD src_size,
    337                               CPDF_ColorSpace* cs) override;
    338   void GetImageInfo(CJPX_Decoder* pDecoder,
    339                     FX_DWORD* width,
    340                     FX_DWORD* height,
    341                     FX_DWORD* components) override;
    342   bool Decode(CJPX_Decoder* pDecoder,
    343               uint8_t* dest_data,
    344               int pitch,
    345               const std::vector<uint8_t>& offsets) override;
    346   void DestroyDecoder(CJPX_Decoder* pDecoder) override;
    347 };
    348 
    349 #ifdef PDF_ENABLE_XFA
    350 class CCodec_TiffModule : public ICodec_TiffModule {
    351  public:
    352   // ICodec_TiffModule
    353   void* CreateDecoder(IFX_FileRead* file_ptr) override;
    354   void GetFrames(void* ctx, int32_t& frames) override;
    355   FX_BOOL LoadFrameInfo(void* ctx,
    356                         int32_t frame,
    357                         FX_DWORD& width,
    358                         FX_DWORD& height,
    359                         FX_DWORD& comps,
    360                         FX_DWORD& bpc,
    361                         CFX_DIBAttribute* pAttribute) override;
    362   FX_BOOL Decode(void* ctx, class CFX_DIBitmap* pDIBitmap) override;
    363   void DestroyDecoder(void* ctx) override;
    364 
    365  protected:
    366   ~CCodec_TiffModule() override {}
    367 };
    368 #endif  // PDF_ENABLE_XFA
    369 
    370 class CCodec_Jbig2Context {
    371  public:
    372   CCodec_Jbig2Context();
    373   ~CCodec_Jbig2Context() {}
    374 
    375   FX_DWORD m_width;
    376   FX_DWORD m_height;
    377   CPDF_StreamAcc* m_pGlobalStream;
    378   CPDF_StreamAcc* m_pSrcStream;
    379   uint8_t* m_dest_buf;
    380   FX_DWORD m_dest_pitch;
    381   IFX_Pause* m_pPause;
    382   CJBig2_Context* m_pContext;
    383   CJBig2_Image* m_dest_image;
    384 };
    385 class CCodec_Jbig2Module : public ICodec_Jbig2Module {
    386  public:
    387   CCodec_Jbig2Module() {}
    388   ~CCodec_Jbig2Module() override;
    389 
    390   // ICodec_Jbig2Module
    391   void* CreateJbig2Context() override;
    392   FXCODEC_STATUS StartDecode(void* pJbig2Context,
    393                              CFX_PrivateData* pPrivateData,
    394                              FX_DWORD width,
    395                              FX_DWORD height,
    396                              CPDF_StreamAcc* src_stream,
    397                              CPDF_StreamAcc* global_stream,
    398                              uint8_t* dest_buf,
    399                              FX_DWORD dest_pitch,
    400                              IFX_Pause* pPause) override;
    401   FXCODEC_STATUS ContinueDecode(void* pJbig2Context,
    402                                 IFX_Pause* pPause) override;
    403   void DestroyJbig2Context(void* pJbig2Context) override;
    404 };
    405 
    406 struct DecodeData {
    407  public:
    408   DecodeData(unsigned char* src_data, OPJ_SIZE_T src_size)
    409       : src_data(src_data), src_size(src_size), offset(0) {}
    410   unsigned char* src_data;
    411   OPJ_SIZE_T src_size;
    412   OPJ_SIZE_T offset;
    413 };
    414 
    415 void sycc420_to_rgb(opj_image_t* img);
    416 
    417 /* Wrappers for C-style callbacks. */
    418 OPJ_SIZE_T opj_read_from_memory(void* p_buffer,
    419                                 OPJ_SIZE_T nb_bytes,
    420                                 void* p_user_data);
    421 OPJ_SIZE_T opj_write_from_memory(void* p_buffer,
    422                                  OPJ_SIZE_T nb_bytes,
    423                                  void* p_user_data);
    424 OPJ_OFF_T opj_skip_from_memory(OPJ_OFF_T nb_bytes, void* p_user_data);
    425 OPJ_BOOL opj_seek_from_memory(OPJ_OFF_T nb_bytes, void* p_user_data);
    426 
    427 #endif  // CORE_SRC_FXCODEC_CODEC_CODEC_INT_H_
    428