Home | History | Annotate | Download | only in fxcodec
      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_INCLUDE_FXCODEC_FX_CODEC_H_
      8 #define CORE_INCLUDE_FXCODEC_FX_CODEC_H_
      9 
     10 #include <map>
     11 #include <memory>
     12 #include <vector>
     13 
     14 #include "core/include/fxcodec/fx_codec_def.h"
     15 #include "core/include/fxcrt/fx_basic.h"
     16 #include "core/include/fxcrt/fx_coordinates.h"  // For FX_RECT.
     17 #include "fx_codec_def.h"
     18 
     19 class CFX_DIBSource;
     20 class CJPX_Decoder;
     21 class CPDF_ColorSpace;
     22 class CPDF_PrivateData;
     23 class CPDF_StreamAcc;
     24 class ICodec_BasicModule;
     25 class ICodec_FaxModule;
     26 class ICodec_FlateModule;
     27 class ICodec_IccModule;
     28 class ICodec_Jbig2Encoder;
     29 class ICodec_Jbig2Module;
     30 class ICodec_JpegModule;
     31 class ICodec_JpxModule;
     32 class ICodec_ScanlineDecoder;
     33 
     34 #ifdef PDF_ENABLE_XFA
     35 class ICodec_BmpModule;
     36 class ICodec_GifModule;
     37 class ICodec_PngModule;
     38 class ICodec_ProgressiveDecoder;
     39 class ICodec_TiffModule;
     40 #endif  // PDF_ENABLE_XFA
     41 
     42 #ifdef PDF_ENABLE_XFA
     43 class CFX_DIBAttribute {
     44  public:
     45   CFX_DIBAttribute();
     46   ~CFX_DIBAttribute();
     47 
     48   int32_t m_nXDPI;
     49   int32_t m_nYDPI;
     50   FX_FLOAT m_fAspectRatio;
     51   FX_WORD m_wDPIUnit;
     52   CFX_ByteString m_strAuthor;
     53   uint8_t m_strTime[20];
     54   int32_t m_nGifLeft;
     55   int32_t m_nGifTop;
     56   FX_DWORD* m_pGifLocalPalette;
     57   FX_DWORD m_nGifLocalPalNum;
     58   int32_t m_nBmpCompressType;
     59   std::map<FX_DWORD, void*> m_Exif;
     60 };
     61 #endif  // PDF_ENABLE_XFA
     62 
     63 class CCodec_ModuleMgr {
     64  public:
     65   CCodec_ModuleMgr();
     66 
     67   ICodec_BasicModule* GetBasicModule() const { return m_pBasicModule.get(); }
     68   ICodec_FaxModule* GetFaxModule() const { return m_pFaxModule.get(); }
     69   ICodec_JpegModule* GetJpegModule() const { return m_pJpegModule.get(); }
     70   ICodec_JpxModule* GetJpxModule() const { return m_pJpxModule.get(); }
     71   ICodec_Jbig2Module* GetJbig2Module() const { return m_pJbig2Module.get(); }
     72   ICodec_IccModule* GetIccModule() const { return m_pIccModule.get(); }
     73   ICodec_FlateModule* GetFlateModule() const { return m_pFlateModule.get(); }
     74 
     75 #ifdef PDF_ENABLE_XFA
     76   ICodec_ProgressiveDecoder* CreateProgressiveDecoder();
     77   ICodec_PngModule* GetPngModule() const { return m_pPngModule.get(); }
     78   ICodec_GifModule* GetGifModule() const { return m_pGifModule.get(); }
     79   ICodec_BmpModule* GetBmpModule() const { return m_pBmpModule.get(); }
     80   ICodec_TiffModule* GetTiffModule() const { return m_pTiffModule.get(); }
     81 #endif  // PDF_ENABLE_XFA
     82 
     83  protected:
     84   std::unique_ptr<ICodec_BasicModule> m_pBasicModule;
     85   std::unique_ptr<ICodec_FaxModule> m_pFaxModule;
     86   std::unique_ptr<ICodec_JpegModule> m_pJpegModule;
     87   std::unique_ptr<ICodec_JpxModule> m_pJpxModule;
     88   std::unique_ptr<ICodec_Jbig2Module> m_pJbig2Module;
     89   std::unique_ptr<ICodec_IccModule> m_pIccModule;
     90 #ifdef PDF_ENABLE_XFA
     91   std::unique_ptr<ICodec_PngModule> m_pPngModule;
     92   std::unique_ptr<ICodec_GifModule> m_pGifModule;
     93   std::unique_ptr<ICodec_BmpModule> m_pBmpModule;
     94   std::unique_ptr<ICodec_TiffModule> m_pTiffModule;
     95 #endif  // PDF_ENABLE_XFA
     96   std::unique_ptr<ICodec_FlateModule> m_pFlateModule;
     97 };
     98 class ICodec_BasicModule {
     99  public:
    100   virtual ~ICodec_BasicModule() {}
    101   virtual FX_BOOL RunLengthEncode(const uint8_t* src_buf,
    102                                   FX_DWORD src_size,
    103                                   uint8_t*& dest_buf,
    104                                   FX_DWORD& dest_size) = 0;
    105   virtual FX_BOOL A85Encode(const uint8_t* src_buf,
    106                             FX_DWORD src_size,
    107                             uint8_t*& dest_buf,
    108                             FX_DWORD& dest_size) = 0;
    109   virtual ICodec_ScanlineDecoder* CreateRunLengthDecoder(const uint8_t* src_buf,
    110                                                          FX_DWORD src_size,
    111                                                          int width,
    112                                                          int height,
    113                                                          int nComps,
    114                                                          int bpc) = 0;
    115 };
    116 
    117 class ICodec_ScanlineDecoder {
    118  public:
    119   virtual ~ICodec_ScanlineDecoder() {}
    120 
    121   virtual FX_DWORD GetSrcOffset() = 0;
    122 
    123   virtual void DownScale(int dest_width, int dest_height) = 0;
    124 
    125   virtual const uint8_t* GetScanline(int line) = 0;
    126 
    127   virtual FX_BOOL SkipToScanline(int line, IFX_Pause* pPause) = 0;
    128 
    129   virtual int GetWidth() = 0;
    130 
    131   virtual int GetHeight() = 0;
    132 
    133   virtual int CountComps() = 0;
    134 
    135   virtual int GetBPC() = 0;
    136 
    137   virtual FX_BOOL IsColorTransformed() = 0;
    138 
    139   virtual void ClearImageData() = 0;
    140 };
    141 
    142 class ICodec_FlateModule {
    143  public:
    144   virtual ~ICodec_FlateModule() {}
    145   virtual ICodec_ScanlineDecoder* CreateDecoder(const uint8_t* src_buf,
    146                                                 FX_DWORD src_size,
    147                                                 int width,
    148                                                 int height,
    149                                                 int nComps,
    150                                                 int bpc,
    151                                                 int predictor,
    152                                                 int Colors,
    153                                                 int BitsPerComponent,
    154                                                 int Columns) = 0;
    155   virtual FX_DWORD FlateOrLZWDecode(FX_BOOL bLZW,
    156                                     const uint8_t* src_buf,
    157                                     FX_DWORD src_size,
    158                                     FX_BOOL bEarlyChange,
    159                                     int predictor,
    160                                     int Colors,
    161                                     int BitsPerComponent,
    162                                     int Columns,
    163                                     FX_DWORD estimated_size,
    164                                     uint8_t*& dest_buf,
    165                                     FX_DWORD& dest_size) = 0;
    166   virtual FX_BOOL Encode(const uint8_t* src_buf,
    167                          FX_DWORD src_size,
    168                          int predictor,
    169                          int Colors,
    170                          int BitsPerComponent,
    171                          int Columns,
    172                          uint8_t*& dest_buf,
    173                          FX_DWORD& dest_size) = 0;
    174   virtual FX_BOOL Encode(const uint8_t* src_buf,
    175                          FX_DWORD src_size,
    176                          uint8_t*& dest_buf,
    177                          FX_DWORD& dest_size) = 0;
    178 };
    179 class ICodec_FaxModule {
    180  public:
    181   virtual ~ICodec_FaxModule() {}
    182 
    183   virtual ICodec_ScanlineDecoder* CreateDecoder(const uint8_t* src_buf,
    184                                                 FX_DWORD src_size,
    185                                                 int width,
    186                                                 int height,
    187                                                 int K,
    188                                                 FX_BOOL EndOfLine,
    189                                                 FX_BOOL EncodedByteAlign,
    190                                                 FX_BOOL BlackIs1,
    191                                                 int Columns,
    192                                                 int Rows) = 0;
    193 
    194   virtual FX_BOOL Encode(const uint8_t* src_buf,
    195                          int width,
    196                          int height,
    197                          int pitch,
    198                          uint8_t*& dest_buf,
    199                          FX_DWORD& dest_size) = 0;
    200 };
    201 class ICodec_JpegModule {
    202  public:
    203   virtual ~ICodec_JpegModule() {}
    204 
    205   virtual ICodec_ScanlineDecoder* CreateDecoder(const uint8_t* src_buf,
    206                                                 FX_DWORD src_size,
    207                                                 int width,
    208                                                 int height,
    209                                                 int nComps,
    210                                                 FX_BOOL ColorTransform) = 0;
    211 
    212   virtual FX_BOOL LoadInfo(const uint8_t* src_buf,
    213                            FX_DWORD src_size,
    214                            int& width,
    215                            int& height,
    216                            int& num_components,
    217                            int& bits_per_components,
    218                            FX_BOOL& color_transform,
    219                            uint8_t** icc_buf_ptr = NULL,
    220                            FX_DWORD* icc_length = NULL) = 0;
    221 
    222   virtual FX_BOOL Encode(const class CFX_DIBSource* pSource,
    223                          uint8_t*& dest_buf,
    224                          FX_STRSIZE& dest_size,
    225                          int quality = 75,
    226                          const uint8_t* icc_buf = NULL,
    227                          FX_DWORD icc_length = 0) = 0;
    228 
    229   virtual void* Start() = 0;
    230 
    231   virtual void Finish(void* pContext) = 0;
    232 
    233   virtual void Input(void* pContext,
    234                      const uint8_t* src_buf,
    235                      FX_DWORD src_size) = 0;
    236 
    237 #ifdef PDF_ENABLE_XFA
    238   virtual int ReadHeader(void* pContext,
    239                          int* width,
    240                          int* height,
    241                          int* nComps,
    242                          CFX_DIBAttribute* pAttribute) = 0;
    243 #else   // PDF_ENABLE_XFA
    244   virtual int ReadHeader(void* pContext,
    245                          int* width,
    246                          int* height,
    247                          int* nComps) = 0;
    248 #endif  // PDF_ENABLE_XFA
    249 
    250   virtual int StartScanline(void* pContext, int down_scale) = 0;
    251 
    252   virtual FX_BOOL ReadScanline(void* pContext, uint8_t* dest_buf) = 0;
    253 
    254   virtual FX_DWORD GetAvailInput(void* pContext,
    255                                  uint8_t** avail_buf_ptr = NULL) = 0;
    256 };
    257 
    258 class ICodec_JpxModule {
    259  public:
    260   virtual ~ICodec_JpxModule() {}
    261 
    262   virtual CJPX_Decoder* CreateDecoder(const uint8_t* src_buf,
    263                                       FX_DWORD src_size,
    264                                       CPDF_ColorSpace* cs) = 0;
    265 
    266   virtual void GetImageInfo(CJPX_Decoder* pDecoder,
    267                             FX_DWORD* width,
    268                             FX_DWORD* height,
    269                             FX_DWORD* components) = 0;
    270 
    271   virtual bool Decode(CJPX_Decoder* pDecoder,
    272                       uint8_t* dest_data,
    273                       int pitch,
    274                       const std::vector<uint8_t>& offsets) = 0;
    275 
    276   virtual void DestroyDecoder(CJPX_Decoder* pDecoder) = 0;
    277 };
    278 #ifdef PDF_ENABLE_XFA
    279 class ICodec_PngModule {
    280  public:
    281   virtual ~ICodec_PngModule() {}
    282 
    283   virtual void* Start(void* pModule) = 0;
    284 
    285   virtual void Finish(void* pContext) = 0;
    286 
    287   virtual FX_BOOL Input(void* pContext,
    288                         const uint8_t* src_buf,
    289                         FX_DWORD src_size,
    290                         CFX_DIBAttribute* pAttribute) = 0;
    291 
    292   FX_BOOL (*ReadHeaderCallback)(void* pModule,
    293                                 int width,
    294                                 int height,
    295                                 int bpc,
    296                                 int pass,
    297                                 int* color_type,
    298                                 double* gamma);
    299 
    300   FX_BOOL (*AskScanlineBufCallback)(void* pModule, int line, uint8_t*& src_buf);
    301 
    302   void (*FillScanlineBufCompletedCallback)(void* pModule, int pass, int line);
    303 };
    304 class ICodec_GifModule {
    305  public:
    306   virtual ~ICodec_GifModule() {}
    307 
    308   virtual void* Start(void* pModule) = 0;
    309 
    310   virtual void Finish(void* pContext) = 0;
    311 
    312   virtual FX_DWORD GetAvailInput(void* pContext,
    313                                  uint8_t** avail_buf_ptr = NULL) = 0;
    314 
    315   virtual void Input(void* pContext,
    316                      const uint8_t* src_buf,
    317                      FX_DWORD src_size) = 0;
    318 
    319   virtual int32_t ReadHeader(void* pContext,
    320                              int* width,
    321                              int* height,
    322                              int* pal_num,
    323                              void** pal_pp,
    324                              int* bg_index,
    325                              CFX_DIBAttribute* pAttribute) = 0;
    326 
    327   virtual int32_t LoadFrameInfo(void* pContext, int* frame_num) = 0;
    328 
    329   void (*RecordCurrentPositionCallback)(void* pModule, FX_DWORD& cur_pos);
    330 
    331   uint8_t* (*AskLocalPaletteBufCallback)(void* pModule,
    332                                          int32_t frame_num,
    333                                          int32_t pal_size);
    334 
    335   virtual int32_t LoadFrame(void* pContext,
    336                             int frame_num,
    337                             CFX_DIBAttribute* pAttribute) = 0;
    338 
    339   FX_BOOL (*InputRecordPositionBufCallback)(void* pModule,
    340                                             FX_DWORD rcd_pos,
    341                                             const FX_RECT& img_rc,
    342                                             int32_t pal_num,
    343                                             void* pal_ptr,
    344                                             int32_t delay_time,
    345                                             FX_BOOL user_input,
    346                                             int32_t trans_index,
    347                                             int32_t disposal_method,
    348                                             FX_BOOL interlace);
    349 
    350   void (*ReadScanlineCallback)(void* pModule,
    351                                int32_t row_num,
    352                                uint8_t* row_buf);
    353 };
    354 class ICodec_BmpModule {
    355  public:
    356   virtual ~ICodec_BmpModule() {}
    357 
    358   virtual void* Start(void* pModule) = 0;
    359 
    360   virtual void Finish(void* pContext) = 0;
    361 
    362   virtual FX_DWORD GetAvailInput(void* pContext,
    363                                  uint8_t** avail_buf_ptr = NULL) = 0;
    364 
    365   virtual void Input(void* pContext,
    366                      const uint8_t* src_buf,
    367                      FX_DWORD src_size) = 0;
    368 
    369   virtual int32_t ReadHeader(void* pContext,
    370                              int32_t* width,
    371                              int32_t* height,
    372                              FX_BOOL* tb_flag,
    373                              int32_t* components,
    374                              int* pal_num,
    375                              FX_DWORD** pal_pp,
    376                              CFX_DIBAttribute* pAttribute) = 0;
    377 
    378   virtual int32_t LoadImage(void* pContext) = 0;
    379 
    380   FX_BOOL (*InputImagePositionBufCallback)(void* pModule, FX_DWORD rcd_pos);
    381 
    382   void (*ReadScanlineCallback)(void* pModule,
    383                                int32_t row_num,
    384                                uint8_t* row_buf);
    385 };
    386 class ICodec_TiffModule {
    387  public:
    388   virtual ~ICodec_TiffModule() {}
    389 
    390   virtual void* CreateDecoder(IFX_FileRead* file_ptr) = 0;
    391 
    392   virtual void GetFrames(void* ctx, int32_t& frames) = 0;
    393 
    394   virtual FX_BOOL LoadFrameInfo(void* ctx,
    395                                 int32_t frame,
    396                                 FX_DWORD& width,
    397                                 FX_DWORD& height,
    398                                 FX_DWORD& comps,
    399                                 FX_DWORD& bpc,
    400                                 CFX_DIBAttribute* pAttribute) = 0;
    401 
    402   virtual FX_BOOL Decode(void* ctx, class CFX_DIBitmap* pDIBitmap) = 0;
    403 
    404   virtual void DestroyDecoder(void* ctx) = 0;
    405 };
    406 #endif
    407 
    408 class ICodec_Jbig2Module {
    409  public:
    410   virtual ~ICodec_Jbig2Module() {}
    411 
    412   virtual void* CreateJbig2Context() = 0;
    413 
    414   virtual FXCODEC_STATUS StartDecode(void* pJbig2Context,
    415                                      CFX_PrivateData* pPrivateData,
    416                                      FX_DWORD width,
    417                                      FX_DWORD height,
    418                                      CPDF_StreamAcc* src_stream,
    419                                      CPDF_StreamAcc* global_stream,
    420                                      uint8_t* dest_buf,
    421                                      FX_DWORD dest_pitch,
    422                                      IFX_Pause* pPause) = 0;
    423 
    424   virtual FXCODEC_STATUS ContinueDecode(void* pJbig2Content,
    425                                         IFX_Pause* pPause) = 0;
    426   virtual void DestroyJbig2Context(void* pJbig2Content) = 0;
    427 };
    428 #ifdef PDF_ENABLE_XFA
    429 class ICodec_ProgressiveDecoder {
    430  public:
    431   virtual ~ICodec_ProgressiveDecoder() {}
    432 
    433   virtual FXCODEC_STATUS LoadImageInfo(IFX_FileRead* pFile,
    434                                        FXCODEC_IMAGE_TYPE imageType,
    435                                        CFX_DIBAttribute* pAttribute) = 0;
    436 
    437   virtual FXCODEC_IMAGE_TYPE GetType() const = 0;
    438   virtual int32_t GetWidth() const = 0;
    439   virtual int32_t GetHeight() const = 0;
    440   virtual int32_t GetNumComponents() const = 0;
    441   virtual int32_t GetBPC() const = 0;
    442 
    443   virtual void SetClipBox(FX_RECT* clip) = 0;
    444 
    445   virtual FXCODEC_STATUS GetFrames(int32_t& frames,
    446                                    IFX_Pause* pPause = NULL) = 0;
    447 
    448   virtual FXCODEC_STATUS StartDecode(class CFX_DIBitmap* pDIBitmap,
    449                                      int32_t start_x,
    450                                      int32_t start_y,
    451                                      int32_t size_x,
    452                                      int32_t size_y,
    453                                      int32_t frames = 0,
    454                                      FX_BOOL bInterpol = TRUE) = 0;
    455 
    456   virtual FXCODEC_STATUS ContinueDecode(IFX_Pause* pPause = NULL) = 0;
    457 };
    458 #endif  // PDF_ENABLE_XFA
    459 class ICodec_Jbig2Encoder {
    460  public:
    461   virtual ~ICodec_Jbig2Encoder() {}
    462 };
    463 class ICodec_IccModule {
    464  public:
    465   typedef enum {
    466     IccCS_Unknown = 0,
    467     IccCS_XYZ,
    468     IccCS_Lab,
    469     IccCS_Luv,
    470     IccCS_YCbCr,
    471     IccCS_Yxy,
    472     IccCS_Hsv,
    473     IccCS_Hls,
    474     IccCS_Gray,
    475     IccCS_Rgb,
    476     IccCS_Cmyk,
    477     IccCS_Cmy
    478   } IccCS;
    479   typedef struct _IccParam {
    480     FX_DWORD Version;
    481     IccCS ColorSpace;
    482     FX_DWORD dwProfileType;
    483     FX_DWORD dwFormat;
    484     uint8_t* pProfileData;
    485     FX_DWORD dwProfileSize;
    486     double Gamma;
    487   } IccParam;
    488 
    489   virtual ~ICodec_IccModule() {}
    490 
    491   virtual IccCS GetProfileCS(const uint8_t* pProfileData,
    492                              unsigned int dwProfileSize) = 0;
    493 
    494   virtual IccCS GetProfileCS(IFX_FileRead* pFile) = 0;
    495 
    496   virtual void* CreateTransform(
    497       ICodec_IccModule::IccParam* pInputParam,
    498       ICodec_IccModule::IccParam* pOutputParam,
    499       ICodec_IccModule::IccParam* pProofParam = NULL,
    500       FX_DWORD dwIntent = Icc_INTENT_PERCEPTUAL,
    501       FX_DWORD dwFlag = Icc_FLAGS_DEFAULT,
    502       FX_DWORD dwPrfIntent = Icc_INTENT_ABSOLUTE_COLORIMETRIC,
    503       FX_DWORD dwPrfFlag = Icc_FLAGS_SOFTPROOFING) = 0;
    504 
    505   virtual void* CreateTransform_sRGB(
    506       const uint8_t* pProfileData,
    507       FX_DWORD dwProfileSize,
    508       int32_t& nComponents,
    509       int32_t intent = 0,
    510       FX_DWORD dwSrcFormat = Icc_FORMAT_DEFAULT) = 0;
    511 
    512   virtual void* CreateTransform_CMYK(
    513       const uint8_t* pSrcProfileData,
    514       FX_DWORD dwSrcProfileSize,
    515       int32_t& nSrcComponents,
    516       const uint8_t* pDstProfileData,
    517       FX_DWORD dwDstProfileSize,
    518       int32_t intent = 0,
    519       FX_DWORD dwSrcFormat = Icc_FORMAT_DEFAULT,
    520       FX_DWORD dwDstFormat = Icc_FORMAT_DEFAULT) = 0;
    521 
    522   virtual void DestroyTransform(void* pTransform) = 0;
    523 
    524   virtual void Translate(void* pTransform,
    525                          FX_FLOAT* pSrcValues,
    526                          FX_FLOAT* pDestValues) = 0;
    527 
    528   virtual void TranslateScanline(void* pTransform,
    529                                  uint8_t* pDest,
    530                                  const uint8_t* pSrc,
    531                                  int pixels) = 0;
    532   virtual void SetComponents(FX_DWORD nComponents) = 0;
    533 };
    534 
    535 void AdobeCMYK_to_sRGB(FX_FLOAT c,
    536                        FX_FLOAT m,
    537                        FX_FLOAT y,
    538                        FX_FLOAT k,
    539                        FX_FLOAT& R,
    540                        FX_FLOAT& G,
    541                        FX_FLOAT& B);
    542 void AdobeCMYK_to_sRGB1(uint8_t c,
    543                         uint8_t m,
    544                         uint8_t y,
    545                         uint8_t k,
    546                         uint8_t& R,
    547                         uint8_t& G,
    548                         uint8_t& B);
    549 FX_BOOL MD5ComputeID(const void* buf, FX_DWORD dwSize, uint8_t ID[16]);
    550 void FaxG4Decode(const uint8_t* src_buf,
    551                  FX_DWORD src_size,
    552                  int* pbitpos,
    553                  uint8_t* dest_buf,
    554                  int width,
    555                  int height,
    556                  int pitch);
    557 
    558 #endif  // CORE_INCLUDE_FXCODEC_FX_CODEC_H_
    559