Merge to XFA: Allow external font-path configuration from pdfium_test.

TBR=tsepez@chromium.org

Review URL: https://codereview.chromium.org/1268323004 .

(cherry picked from commit 9311163b564785a3a3ccdcb09bd3b7d0b2976d1a)

Review URL: https://codereview.chromium.org/1368513002 .
diff --git a/core/include/fxge/fx_font.h b/core/include/fxge/fx_font.h
index 2d19db6..3484196 100644
--- a/core/include/fxge/fx_font.h
+++ b/core/include/fxge/fx_font.h
@@ -349,7 +349,7 @@
 
 class IFX_SystemFontInfo {
  public:
-  static IFX_SystemFontInfo* CreateDefault();
+  static IFX_SystemFontInfo* CreateDefault(const char** pUserPaths);
   virtual void Release() = 0;
 
   virtual FX_BOOL EnumFontList(CFX_FontMapper* pMapper) = 0;
diff --git a/core/include/fxge/fx_ge.h b/core/include/fxge/fx_ge.h
index 23be364..4cfe622 100644
--- a/core/include/fxge/fx_ge.h
+++ b/core/include/fxge/fx_ge.h
@@ -19,7 +19,7 @@
 
 class CFX_GEModule {
  public:
-  static void Create();
+  static void Create(const char** pUserFontPaths);
 
   static void Use(CFX_GEModule* pMgr);
 
@@ -41,7 +41,7 @@
   void* GetPlatformData() { return m_pPlatformData; }
 
  protected:
-  CFX_GEModule();
+  explicit CFX_GEModule(const char** pUserFontPaths);
 
   ~CFX_GEModule();
   void InitPlatform();
@@ -53,6 +53,7 @@
   CFX_FontMgr* m_pFontMgr;
   CCodec_ModuleMgr* m_pCodecModule;
   void* m_pPlatformData;
+  const char** m_pUserFontPaths;
 };
 typedef struct {
   FX_FLOAT m_PointX;
diff --git a/core/src/fxge/apple/fx_mac_imp.cpp b/core/src/fxge/apple/fx_mac_imp.cpp
index 88a51bd..07e3d02 100644
--- a/core/src/fxge/apple/fx_mac_imp.cpp
+++ b/core/src/fxge/apple/fx_mac_imp.cpp
@@ -94,7 +94,7 @@
 
   return NULL;
 }
-IFX_SystemFontInfo* IFX_SystemFontInfo::CreateDefault() {
+IFX_SystemFontInfo* IFX_SystemFontInfo::CreateDefault(const char** pUnused) {
   CFX_MacFontInfo* pInfo = new CFX_MacFontInfo;
   if (!pInfo) {
     return NULL;
@@ -106,7 +106,7 @@
 }
 void CFX_GEModule::InitPlatform() {
   m_pPlatformData = new CApplePlatform;
-  m_pFontMgr->SetSystemFontInfo(IFX_SystemFontInfo::CreateDefault());
+  m_pFontMgr->SetSystemFontInfo(IFX_SystemFontInfo::CreateDefault(nullptr));
 }
 void CFX_GEModule::DestroyPlatform() {
   delete (CApplePlatform*)m_pPlatformData;
diff --git a/core/src/fxge/ge/fx_ge.cpp b/core/src/fxge/ge/fx_ge.cpp
index 607c9ee..6dfed88 100644
--- a/core/src/fxge/ge/fx_ge.cpp
+++ b/core/src/fxge/ge/fx_ge.cpp
@@ -7,12 +7,13 @@
 #include "../../../include/fxge/fx_ge.h"
 #include "text_int.h"
 static CFX_GEModule* g_pGEModule = NULL;
-CFX_GEModule::CFX_GEModule() {
+CFX_GEModule::CFX_GEModule(const char** pUserFontPaths) {
   m_pFontCache = NULL;
   m_pFontMgr = NULL;
   m_FTLibrary = NULL;
   m_pCodecModule = NULL;
   m_pPlatformData = NULL;
+  m_pUserFontPaths = pUserFontPaths;
 }
 CFX_GEModule::~CFX_GEModule() {
   delete m_pFontCache;
@@ -24,11 +25,8 @@
 CFX_GEModule* CFX_GEModule::Get() {
   return g_pGEModule;
 }
-void CFX_GEModule::Create() {
-  g_pGEModule = new CFX_GEModule;
-  if (!g_pGEModule) {
-    return;
-  }
+void CFX_GEModule::Create(const char** userFontPaths) {
+  g_pGEModule = new CFX_GEModule(userFontPaths);
   g_pGEModule->m_pFontMgr = new CFX_FontMgr;
   g_pGEModule->InitPlatform();
   g_pGEModule->SetTextGamma(2.2f);
diff --git a/core/src/fxge/ge/fx_ge_fontmap.cpp b/core/src/fxge/ge/fx_ge_fontmap.cpp
index 63d8181..e1f2568 100644
--- a/core/src/fxge/ge/fx_ge_fontmap.cpp
+++ b/core/src/fxge/ge/fx_ge_fontmap.cpp
@@ -1343,7 +1343,7 @@
   m_Face = NULL;
 }
 #if _FX_OS_ == _FX_ANDROID_
-IFX_SystemFontInfo* IFX_SystemFontInfo::CreateDefault() {
+IFX_SystemFontInfo* IFX_SystemFontInfo::CreateDefault(const char** pUnused) {
   return NULL;
 }
 #endif
diff --git a/core/src/fxge/ge/fx_ge_linux.cpp b/core/src/fxge/ge/fx_ge_linux.cpp
index 4e713dc..065fd12 100644
--- a/core/src/fxge/ge/fx_ge_linux.cpp
+++ b/core/src/fxge/ge/fx_ge_linux.cpp
@@ -34,7 +34,7 @@
                 int pitch_family,
                 const FX_CHAR* family,
                 int& iExact) override;
-  FX_BOOL ParseFontCfg();
+  FX_BOOL ParseFontCfg(const char** pUserPaths);
   void* FindFont(int weight,
                  FX_BOOL bItalic,
                  int charset,
@@ -226,12 +226,9 @@
   }
   return pFind;
 }
-IFX_SystemFontInfo* IFX_SystemFontInfo::CreateDefault() {
+IFX_SystemFontInfo* IFX_SystemFontInfo::CreateDefault(const char** pUserPaths) {
   CFX_LinuxFontInfo* pInfo = new CFX_LinuxFontInfo;
-  if (!pInfo) {
-    return NULL;
-  }
-  if (!pInfo->ParseFontCfg()) {
+  if (!pInfo->ParseFontCfg(pUserPaths)) {
     pInfo->AddPath("/usr/share/fonts");
     pInfo->AddPath("/usr/share/X11/fonts/Type1");
     pInfo->AddPath("/usr/share/X11/fonts/TTF");
@@ -239,11 +236,18 @@
   }
   return pInfo;
 }
-FX_BOOL CFX_LinuxFontInfo::ParseFontCfg() {
-  return FALSE;
+FX_BOOL CFX_LinuxFontInfo::ParseFontCfg(const char** pUserPaths) {
+  if (!pUserPaths) {
+    return FALSE;
+  }
+  for (const char** pPath = pUserPaths; *pPath; ++pPath) {
+    AddPath(*pPath);
+  }
+  return TRUE;
 }
 void CFX_GEModule::InitPlatform() {
-  m_pFontMgr->SetSystemFontInfo(IFX_SystemFontInfo::CreateDefault());
+  m_pFontMgr->SetSystemFontInfo(
+      IFX_SystemFontInfo::CreateDefault(m_pUserFontPaths));
 }
 void CFX_GEModule::DestroyPlatform() {}
 #endif  // _FXM_PLATFORM_ == _FXM_PLATFORM_LINUX_
diff --git a/core/src/fxge/win32/fx_win32_device.cpp b/core/src/fxge/win32/fx_win32_device.cpp
index d5f2968..a0ccb83 100644
--- a/core/src/fxge/win32/fx_win32_device.cpp
+++ b/core/src/fxge/win32/fx_win32_device.cpp
@@ -405,7 +405,7 @@
   charset = tm.tmCharSet;
   return TRUE;
 }
-IFX_SystemFontInfo* IFX_SystemFontInfo::CreateDefault() {
+IFX_SystemFontInfo* IFX_SystemFontInfo::CreateDefault(const char** pUnused) {
   return new CFX_Win32FontInfo;
 }
 void CFX_GEModule::InitPlatform() {
@@ -419,7 +419,7 @@
   pPlatformData->m_bHalfTone = ver.dwMajorVersion >= 5;
   pPlatformData->m_GdiplusExt.Load();
   m_pPlatformData = pPlatformData;
-  m_pFontMgr->SetSystemFontInfo(IFX_SystemFontInfo::CreateDefault());
+  m_pFontMgr->SetSystemFontInfo(IFX_SystemFontInfo::CreateDefault(nullptr));
 }
 void CFX_GEModule::DestroyPlatform() {
   delete (CWin32Platform*)m_pPlatformData;
diff --git a/fpdfsdk/src/fpdf_sysfontinfo.cpp b/fpdfsdk/src/fpdf_sysfontinfo.cpp
index 53610b0..a004e86 100644
--- a/fpdfsdk/src/fpdf_sysfontinfo.cpp
+++ b/fpdfsdk/src/fpdf_sysfontinfo.cpp
@@ -168,7 +168,7 @@
 }
 
 DLLEXPORT FPDF_SYSFONTINFO* STDCALL FPDF_GetDefaultSystemFontInfo() {
-  IFX_SystemFontInfo* pFontInfo = IFX_SystemFontInfo::CreateDefault();
+  IFX_SystemFontInfo* pFontInfo = IFX_SystemFontInfo::CreateDefault(nullptr);
   if (pFontInfo == NULL)
     return NULL;
 
diff --git a/fpdfsdk/src/fpdfview.cpp b/fpdfsdk/src/fpdfview.cpp
index c2b53be..414ade7 100644
--- a/fpdfsdk/src/fpdfview.cpp
+++ b/fpdfsdk/src/fpdfview.cpp
@@ -180,9 +180,14 @@
 CCodec_ModuleMgr* g_pCodecModule = nullptr;
 
 DLLEXPORT void STDCALL FPDF_InitLibrary() {
+  FPDF_InitLibraryWithConfig(nullptr);
+}
+
+DLLEXPORT void STDCALL
+FPDF_InitLibraryWithConfig(const FPDF_LIBRARY_CONFIG* cfg) {
   g_pCodecModule = new CCodec_ModuleMgr();
 
-  CFX_GEModule::Create();
+  CFX_GEModule::Create(cfg ? cfg->m_pUserFontPaths : nullptr);
   CFX_GEModule::Get()->SetCodecModule(g_pCodecModule);
 
   CPDF_ModuleMgr::Create();
diff --git a/fpdfsdk/src/fpdfview_c_api_test.c b/fpdfsdk/src/fpdfview_c_api_test.c
index d16bf99..4205ca1 100644
--- a/fpdfsdk/src/fpdfview_c_api_test.c
+++ b/fpdfsdk/src/fpdfview_c_api_test.c
@@ -192,6 +192,7 @@
 
     // fpdfview.h
     CHK(FPDF_InitLibrary);
+    CHK(FPDF_InitLibraryWithConfig);
     CHK(FPDF_DestroyLibrary);
     CHK(FPDF_SetSandBoxPolicy);
     CHK(FPDF_LoadDocument);
diff --git a/public/fpdfview.h b/public/fpdfview.h
index 158f821..bfa13c4 100644
--- a/public/fpdfview.h
+++ b/public/fpdfview.h
@@ -152,9 +152,33 @@
 // Return value:
 //          None.
 // Comments:
+//          Convenience function to call FPDF_InitLibraryWithConfig() for
+//          backwards comatibility purposes.
+DLLEXPORT void STDCALL FPDF_InitLibrary();
+
+// Process-wide options for initializing library.
+typedef struct FPDF_LIBRARY_CONFIG_ {
+  // Version number of the interface. Currently must be 1.
+  int version;
+
+  // Array of paths to scan in place of the defaults when using built-in
+  // FXGE font loading code. The array is terminated by a NULL pointer.
+  // The Array may be NULL itself to use the default paths. May be ignored
+  // entirely depending upon the platform.
+  const char** m_pUserFontPaths;
+} FPDF_LIBRARY_CONFIG;
+
+// Function: FPDF_InitLibraryWithConfig
+//          Initialize the FPDFSDK library
+// Parameters:
+//          cfg - configuration information as above.
+// Return value:
+//          None.
+// Comments:
 //          You have to call this function before you can call any PDF
 //          processing functions.
-DLLEXPORT void STDCALL FPDF_InitLibrary();
+DLLEXPORT void STDCALL
+FPDF_InitLibraryWithConfig(const FPDF_LIBRARY_CONFIG* config);
 
 // Function: FPDF_DestroyLibary
 //          Release all resources allocated by the FPDFSDK library.
diff --git a/samples/pdfium_test.cc b/samples/pdfium_test.cc
index f060eb0..bf10675 100644
--- a/samples/pdfium_test.cc
+++ b/samples/pdfium_test.cc
@@ -48,6 +48,7 @@
   std::string scale_factor_as_string;
   std::string exe_path;
   std::string bin_directory;
+  std::string font_directory;
 };
 
 // Reads the entire contents of a file into a newly malloc'd buffer.
@@ -348,6 +349,13 @@
         return false;
       }
       options->output_format = OUTPUT_PNG;
+    } else if (cur_arg.size() > 11 &&
+               cur_arg.compare(0, 11, "--font-dir=") == 0) {
+      if (!options->font_directory.empty()) {
+        fprintf(stderr, "Duplicate --font-dir argument\n");
+        return false;
+      }
+      options->font_directory = cur_arg.substr(11);
     }
 #ifdef _WIN32
     else if (cur_arg == "--emf") {
@@ -578,8 +586,9 @@
 
 static const char usage_string[] =
     "Usage: pdfium_test [OPTION] [FILE]...\n"
-    "  --bin-dir=<path> - override path to v8 external data\n"
-    "  --scale=<number> - scale output size by number (e.g. 0.5)\n"
+    "  --bin-dir=<path>  - override path to v8 external data\n"
+    "  --font-dir=<path> - override path to external fonts\n"
+    "  --scale=<number>  - scale output size by number (e.g. 0.5)\n"
 #ifdef _WIN32
     "  --bmp - write page images <pdf-name>.<page-number>.bmp\n"
     "  --emf - write page meta files <pdf-name>.<page-number>.emf\n"
@@ -612,7 +621,17 @@
   v8::V8::SetSnapshotDataBlob(&snapshot);
 #endif  // V8_USE_EXTERNAL_STARTUP_DATA
 
-  FPDF_InitLibrary();
+  if (!options.font_directory.empty()) {
+    const char* path_array[2];
+    path_array[0] = options.font_directory.c_str();
+    path_array[1] = nullptr;
+    FPDF_LIBRARY_CONFIG config;
+    config.version = 1;
+    config.m_pUserFontPaths = path_array;
+    FPDF_InitLibraryWithConfig(&config);
+  } else {
+    FPDF_InitLibrary();
+  }
 
   UNSUPPORT_INFO unsuppored_info;
   memset(&unsuppored_info, '\0', sizeof(unsuppored_info));