Various changes to JBig2 cache:
[pdfium.git] / core / src / fxcodec / codec / codec_int.h
index 9fe77a4..b08dee7 100644 (file)
@@ -9,11 +9,16 @@
 
 #include <limits.h>
 #include <list>
+#include <map>
 
+#include "../../../../third_party/base/nonstd_unique_ptr.h"
 #include "../../../../third_party/libopenjpeg20/openjpeg.h"  // For OPJ_SIZE_T.
 #include "../../../include/fxcodec/fx_codec.h"
 #include "../jbig2/JBig2_Context.h"
 
+class CFX_IccProfileCache;
+class CFX_IccTransformCache;
+
 class CCodec_BasicModule : public ICodec_BasicModule {
  public:
   virtual FX_BOOL RunLengthEncode(const uint8_t* src_buf,
@@ -32,12 +37,6 @@ class CCodec_BasicModule : public ICodec_BasicModule {
                                                          int bpc);
 };
 
-struct CCodec_ImageDataCache {
-  int m_Width, m_Height;
-  int m_nCachedLines;
-  uint8_t m_Data;
-};
-
 class CCodec_ScanlineDecoder : public ICodec_ScanlineDecoder {
  public:
   CCodec_ScanlineDecoder();
@@ -46,52 +45,58 @@ class CCodec_ScanlineDecoder : public ICodec_ScanlineDecoder {
   // ICodec_ScanlineDecoder
   FX_DWORD GetSrcOffset() override { return -1; }
   void DownScale(int dest_width, int dest_height) override;
-  uint8_t* GetScanline(int line) override;
+  const uint8_t* GetScanline(int line) override;
   FX_BOOL SkipToScanline(int line, IFX_Pause* pPause) override;
   int GetWidth() override { return m_OutputWidth; }
   int GetHeight() override { return m_OutputHeight; }
   int CountComps() override { return m_nComps; }
   int GetBPC() override { return m_bpc; }
   FX_BOOL IsColorTransformed() override { return m_bColorTransformed; }
-  void ClearImageData() override {
-    if (m_pDataCache) {
-      FX_Free(m_pDataCache);
-    }
-    m_pDataCache = NULL;
-  }
+  void ClearImageData() override { m_pDataCache.reset(); }
 
  protected:
-  int m_OrigWidth;
+  class ImageDataCache {
+   public:
+    ImageDataCache(int width, int height, int pitch);
+    ~ImageDataCache();
+
+    bool AllocateCache();
+    void AppendLine(const uint8_t* line);
+
+    int NumLines() const { return m_nCachedLines; }
+    const uint8_t* GetLine(int line) const;
+    bool IsSameDimensions(int width, int height) const {
+      return width == m_Width && height == m_Height;
+    }
 
-  int m_OrigHeight;
+   private:
+    bool IsValid() const { return m_Data.get() != nullptr; }
 
-  int m_DownScale;
+    const int m_Width;
+    const int m_Height;
+    const int m_Pitch;
+    int m_nCachedLines;
+    nonstd::unique_ptr<uint8_t, FxFreeDeleter> m_Data;
+  };
 
-  int m_OutputWidth;
+  virtual FX_BOOL v_Rewind() = 0;
+  virtual uint8_t* v_GetNextLine() = 0;
+  virtual void v_DownScale(int dest_width, int dest_height) = 0;
 
-  int m_OutputHeight;
+  uint8_t* ReadNextLine();
 
+  int m_OrigWidth;
+  int m_OrigHeight;
+  int m_DownScale;
+  int m_OutputWidth;
+  int m_OutputHeight;
   int m_nComps;
-
   int m_bpc;
-
   int m_Pitch;
-
   FX_BOOL m_bColorTransformed;
-
-  uint8_t* ReadNextLine();
-
-  virtual FX_BOOL v_Rewind() = 0;
-
-  virtual uint8_t* v_GetNextLine() = 0;
-
-  virtual void v_DownScale(int dest_width, int dest_height) = 0;
-
   int m_NextLine;
-
   uint8_t* m_pLastScanline;
-
-  CCodec_ImageDataCache* m_pDataCache;
+  nonstd::unique_ptr<ImageDataCache> m_pDataCache;
 };
 
 class CCodec_FaxModule : public ICodec_FaxModule {
@@ -227,128 +232,75 @@ class CCodec_IccModule : public ICodec_IccModule {
   virtual ~CCodec_IccModule();
 
  protected:
-  CFX_MapByteStringToPtr m_MapTranform;
-  CFX_MapByteStringToPtr m_MapProfile;
-  FX_DWORD m_nComponents;
-  typedef enum {
+  enum Icc_CLASS {
     Icc_CLASS_INPUT = 0,
     Icc_CLASS_OUTPUT,
     Icc_CLASS_PROOF,
     Icc_CLASS_MAX
-  } Icc_CLASS;
+  };
   void* CreateProfile(ICodec_IccModule::IccParam* pIccParam,
                       Icc_CLASS ic,
                       CFX_BinaryBuf* pTransformKey);
+
+  FX_DWORD m_nComponents;
+  std::map<CFX_ByteString, CFX_IccTransformCache*> m_MapTranform;
+  std::map<CFX_ByteString, CFX_IccProfileCache*> m_MapProfile;
 };
 
 class CCodec_JpxModule : public ICodec_JpxModule {
  public:
   CCodec_JpxModule();
-  void* CreateDecoder(const uint8_t* src_buf,
-                      FX_DWORD src_size,
-                      FX_BOOL useColorSpace = FALSE);
-  void GetImageInfo(void* ctx,
-                    FX_DWORD& width,
-                    FX_DWORD& height,
-                    FX_DWORD& codestream_nComps,
-                    FX_DWORD& output_nComps);
-  FX_BOOL Decode(void* ctx,
-                 uint8_t* dest_data,
-                 int pitch,
-                 FX_BOOL bTranslateColor,
-                 uint8_t* offsets);
-  void DestroyDecoder(void* ctx);
-};
-
-class CPDF_Jbig2Interface : public CJBig2_Module {
- public:
-  virtual void* JBig2_Malloc(FX_DWORD dwSize) {
-    return FX_Alloc(uint8_t, dwSize);
-  }
-  virtual void* JBig2_Malloc2(FX_DWORD num, FX_DWORD dwSize) {
-    if (dwSize && num >= UINT_MAX / dwSize) {
-      return NULL;
-    }
-    return FX_Alloc(uint8_t, num * dwSize);
-  }
-  virtual void* JBig2_Malloc3(FX_DWORD num, FX_DWORD dwSize, FX_DWORD dwSize2) {
-    if (dwSize2 && dwSize >= UINT_MAX / dwSize2) {
-      return NULL;
-    }
-    FX_DWORD size = dwSize2 * dwSize;
-    if (size && num >= UINT_MAX / size) {
-      return NULL;
-    }
-    return FX_Alloc(uint8_t, num * size);
-  }
-  virtual void* JBig2_Realloc(void* pMem, FX_DWORD dwSize) {
-    return FX_Realloc(uint8_t, pMem, dwSize);
-  }
-  virtual void JBig2_Free(void* pMem) { FX_Free(pMem); }
+  ~CCodec_JpxModule() override;
+
+  // ICodec_JpxModule:
+  CJPX_Decoder* CreateDecoder(const uint8_t* src_buf,
+                              FX_DWORD src_size,
+                              bool use_colorspace) override;
+  void GetImageInfo(CJPX_Decoder* pDecoder,
+                    FX_DWORD* width,
+                    FX_DWORD* height,
+                    FX_DWORD* components) override;
+  bool Decode(CJPX_Decoder* pDecoder,
+              uint8_t* dest_data,
+              int pitch,
+              const std::vector<uint8_t>& offsets) override;
+  void DestroyDecoder(CJPX_Decoder* pDecoder) override;
 };
 
 class CCodec_Jbig2Context {
  public:
   CCodec_Jbig2Context();
-  ~CCodec_Jbig2Context(){};
+  ~CCodec_Jbig2Context() {}
 
   FX_DWORD m_width;
   FX_DWORD m_height;
-  uint8_t* m_src_buf;
-  FX_DWORD m_src_size;
-  const uint8_t* m_global_data;
-  FX_DWORD m_global_size;
+  CPDF_StreamAcc* m_pGlobalStream;
+  CPDF_StreamAcc* m_pSrcStream;
   uint8_t* m_dest_buf;
   FX_DWORD m_dest_pitch;
-  FX_BOOL m_bFileReader;
   IFX_Pause* m_pPause;
   CJBig2_Context* m_pContext;
   CJBig2_Image* m_dest_image;
 };
 class CCodec_Jbig2Module : public ICodec_Jbig2Module {
  public:
-  CCodec_Jbig2Module(){};
+  CCodec_Jbig2Module() {}
   ~CCodec_Jbig2Module() override;
 
   // ICodec_Jbig2Module
-  FX_BOOL Decode(FX_DWORD width,
-                 FX_DWORD height,
-                 const uint8_t* src_buf,
-                 FX_DWORD src_size,
-                 const uint8_t* global_data,
-                 FX_DWORD global_size,
-                 uint8_t* dest_buf,
-                 FX_DWORD dest_pitch) override;
-  FX_BOOL Decode(IFX_FileRead* file_ptr,
-                 FX_DWORD& width,
-                 FX_DWORD& height,
-                 FX_DWORD& pitch,
-                 uint8_t*& dest_buf) override;
   void* CreateJbig2Context() override;
   FXCODEC_STATUS StartDecode(void* pJbig2Context,
+                             CFX_PrivateData* pPrivateData,
                              FX_DWORD width,
                              FX_DWORD height,
-                             const uint8_t* src_buf,
-                             FX_DWORD src_size,
-                             const uint8_t* global_data,
-                             FX_DWORD global_size,
+                             CPDF_StreamAcc* src_stream,
+                             CPDF_StreamAcc* global_stream,
                              uint8_t* dest_buf,
                              FX_DWORD dest_pitch,
                              IFX_Pause* pPause) override;
-  FXCODEC_STATUS StartDecode(void* pJbig2Context,
-                             IFX_FileRead* file_ptr,
-                             FX_DWORD& width,
-                             FX_DWORD& height,
-                             FX_DWORD& pitch,
-                             uint8_t*& dest_buf,
-                             IFX_Pause* pPause) override;
   FXCODEC_STATUS ContinueDecode(void* pJbig2Context,
                                 IFX_Pause* pPause) override;
   void DestroyJbig2Context(void* pJbig2Context) override;
-
- private:
-  CPDF_Jbig2Interface m_Module;
-  std::list<CJBig2_CachePair> m_SymbolDictCache;
 };
 
 struct DecodeData {