// 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 "../fxcrt/fx_coordinates.h"
#include "../fxcrt/fx_system.h"
#include "third_party/base/nonstd_unique_ptr.h"

class CCodec_ModuleMgr;
class CFX_AffineMatrix;
class CFX_BitmapDevice;
class CFX_DIBSource;
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_
