// Copyright 2014 PDFium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

#ifndef CORE_INCLUDE_FPDFAPI_FPDF_MODULE_H_
#define CORE_INCLUDE_FPDFAPI_FPDF_MODULE_H_

#include "core/include/fxcrt/fx_coordinates.h"
#include "core/include/fxcrt/fx_system.h"
#include "third_party/base/nonstd_unique_ptr.h"

class CCodec_ModuleMgr;
class CFX_BitmapDevice;
class CFX_DIBSource;
class CFX_Matrix;
class CPDF_ColorSpace;
class CPDF_Dictionary;
class CPDF_DocPageData;
class CPDF_DocRenderData;
class CPDF_Document;
class CPDF_FontGlobals;
class CPDF_Image;
class CPDF_Page;
class CPDF_PageObjects;
class CPDF_PageRenderCache;
class CPDF_RenderConfig;
class CPDF_RenderOptions;
class CPDF_SecurityHandler;
class CPDF_Stream;
class ICodec_FaxModule;
class ICodec_FlateModule;
class ICodec_IccModule;
class ICodec_Jbig2Module;
class ICodec_JpegModule;
class ICodec_JpxModule;
class IPDF_FontMapper;
class IPDF_PageModule;
class IPDF_RenderModule;

class CPDF_ModuleMgr {
 public:
  static CPDF_ModuleMgr* Get();
  static void Create();
  static void Destroy();
  static const int kFileBufSize = 512;

  void SetCodecModule(CCodec_ModuleMgr* pModule) { m_pCodecModule = pModule; }
  CCodec_ModuleMgr* GetCodecModule() { return m_pCodecModule; }

  void InitPageModule();
  void InitRenderModule();

  IPDF_RenderModule* GetRenderModule() const { return m_pRenderModule.get(); }
  IPDF_PageModule* GetPageModule() const { return m_pPageModule.get(); }

  void LoadEmbeddedGB1CMaps();
  void LoadEmbeddedCNS1CMaps();
  void LoadEmbeddedJapan1CMaps();
  void LoadEmbeddedKorea1CMaps();

  ICodec_FaxModule* GetFaxModule();
  ICodec_JpegModule* GetJpegModule();
  ICodec_JpxModule* GetJpxModule();
  ICodec_Jbig2Module* GetJbig2Module();
  ICodec_IccModule* GetIccModule();
  ICodec_FlateModule* GetFlateModule();

  void SetPrivateData(void* module_id,
                      void* pData,
                      PD_CALLBACK_FREEDATA callback);

  void* GetPrivateData(void* module_id);

 private:
  CPDF_ModuleMgr();
  ~CPDF_ModuleMgr();

  CCodec_ModuleMgr* m_pCodecModule;
  nonstd::unique_ptr<IPDF_RenderModule> m_pRenderModule;
  nonstd::unique_ptr<IPDF_PageModule> m_pPageModule;
  FX_BOOL (*m_pDownloadCallback)(const FX_CHAR* module_name);
  CFX_PrivateData m_privateData;
};

class IPDF_PageModule {
 public:
  virtual ~IPDF_PageModule() {}

  virtual CPDF_DocPageData* CreateDocData(CPDF_Document* pDoc) = 0;
  virtual void ReleaseDoc(CPDF_Document*) = 0;
  virtual void ClearDoc(CPDF_Document*) = 0;
  virtual CPDF_FontGlobals* GetFontGlobals() = 0;
  virtual void ClearStockFont(CPDF_Document* pDoc) = 0;
  virtual void NotifyCJKAvailable() = 0;
  virtual CPDF_ColorSpace* GetStockCS(int family) = 0;
};

class IPDF_RenderModule {
 public:
  virtual ~IPDF_RenderModule() {}

  virtual CPDF_DocRenderData* CreateDocData(CPDF_Document* pDoc) = 0;
  virtual void DestroyDocData(CPDF_DocRenderData*) = 0;
  virtual void ClearDocData(CPDF_DocRenderData*) = 0;
  virtual CPDF_DocRenderData* GetRenderData() = 0;
  virtual CPDF_PageRenderCache* CreatePageCache(CPDF_Page* pPage) = 0;
  virtual void DestroyPageCache(CPDF_PageRenderCache*) = 0;
  virtual CPDF_RenderConfig* GetConfig() = 0;
};

#endif  // CORE_INCLUDE_FPDFAPI_FPDF_MODULE_H_
