Make Android font manager respect `m_pUserFontPaths`

During PDFium initialization, the caller can passes in an
FPDF_LIBRARY_CONFIG with `m_pUserFontPaths` set. Plumb these paths from
CAndroidPlatform to CFX_AndroidFontInfo to CFPF_SkiaFontMgr. Then
have CFPF_SkiaFontMgr scan those directories.

Rename CFPF_SkiaFontMgr::LoadSystemFonts() to LoadFonts() to better
reflect its new role.

Bug: 350526066
Change-Id: I97de0beca0058b6cce4fe6a66225e37f105347ca
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/121530
Reviewed-by: Tom Sepez <tsepez@google.com>
Commit-Queue: Lei Zhang <thestig@chromium.org>
Reviewed-by: Tom Sepez <tsepez@chromium.org>
diff --git a/core/fxge/android/cfpf_skiafontmgr.cpp b/core/fxge/android/cfpf_skiafontmgr.cpp
index 7c88f48..23bbb97 100644
--- a/core/fxge/android/cfpf_skiafontmgr.cpp
+++ b/core/fxge/android/cfpf_skiafontmgr.cpp
@@ -11,6 +11,7 @@
 #include <iterator>
 #include <utility>
 
+#include "core/fxcrt/compiler_specific.h"
 #include "core/fxcrt/containers/adapters.h"
 #include "core/fxcrt/fx_codepage.h"
 #include "core/fxcrt/fx_extension.h"
@@ -235,12 +236,23 @@
   return true;
 }
 
-void CFPF_SkiaFontMgr::LoadSystemFonts() {
-  if (loaded_system_fonts_) {
+void CFPF_SkiaFontMgr::LoadFonts(const char** user_paths) {
+  if (loaded_fonts_) {
     return;
   }
+
   ScanPath("/system/fonts");
-  loaded_system_fonts_ = true;
+
+  if (user_paths) {
+    // SAFETY: nullptr-terminated array required from caller.
+    UNSAFE_BUFFERS({
+      for (const char** path = user_paths; *path; ++path) {
+        ScanPath(*path);
+      }
+    });
+  }
+
+  loaded_fonts_ = true;
 }
 
 CFPF_SkiaFont* CFPF_SkiaFontMgr::CreateFont(ByteStringView family_name,
diff --git a/core/fxge/android/cfpf_skiafontmgr.h b/core/fxge/android/cfpf_skiafontmgr.h
index 53ea58b..3958b52 100644
--- a/core/fxge/android/cfpf_skiafontmgr.h
+++ b/core/fxge/android/cfpf_skiafontmgr.h
@@ -25,13 +25,13 @@
   CFPF_SkiaFontMgr();
   ~CFPF_SkiaFontMgr();
 
-  void LoadSystemFonts();
+  void LoadFonts(const char** user_paths);
   CFPF_SkiaFont* CreateFont(ByteStringView family_name,
                             FX_Charset charset,
                             uint32_t style);
 
   bool InitFTLibrary();
-  RetainPtr<CFX_Face> GetFontFace(ByteStringView filename, int32_t face_index);
+  RetainPtr<CFX_Face> GetFontFace(ByteStringView path, int32_t face_index);
 
  private:
   void ScanPath(const ByteString& path);
@@ -39,7 +39,7 @@
   std::unique_ptr<CFPF_SkiaPathFont> ReportFace(RetainPtr<CFX_Face> face,
                                                 const ByteString& file);
 
-  bool loaded_system_fonts_ = false;
+  bool loaded_fonts_ = false;
   ScopedFXFTLibraryRec ft_library_;
   std::vector<std::unique_ptr<CFPF_SkiaPathFont>> font_faces_;
   // Key is a hash based on CreateFont() parameters.
diff --git a/core/fxge/android/cfx_androidfontinfo.cpp b/core/fxge/android/cfx_androidfontinfo.cpp
index 2799dcd..0154b92 100644
--- a/core/fxge/android/cfx_androidfontinfo.cpp
+++ b/core/fxge/android/cfx_androidfontinfo.cpp
@@ -16,12 +16,14 @@
 
 CFX_AndroidFontInfo::~CFX_AndroidFontInfo() = default;
 
-bool CFX_AndroidFontInfo::Init(CFPF_SkiaFontMgr* pFontMgr) {
-  if (!pFontMgr)
+bool CFX_AndroidFontInfo::Init(CFPF_SkiaFontMgr* pFontMgr,
+                               const char** user_paths) {
+  if (!pFontMgr) {
     return false;
+  }
 
-  pFontMgr->LoadSystemFonts();
   m_pFontMgr = pFontMgr;
+  m_pFontMgr->LoadFonts(user_paths);
   return true;
 }
 
diff --git a/core/fxge/android/cfx_androidfontinfo.h b/core/fxge/android/cfx_androidfontinfo.h
index 3886f70..647e89b 100644
--- a/core/fxge/android/cfx_androidfontinfo.h
+++ b/core/fxge/android/cfx_androidfontinfo.h
@@ -21,7 +21,7 @@
   CFX_AndroidFontInfo();
   ~CFX_AndroidFontInfo() override;
 
-  bool Init(CFPF_SkiaFontMgr* pFontMgr);
+  bool Init(CFPF_SkiaFontMgr* pFontMgr, const char** user_paths);
 
   // SystemFontInfoIface:
   bool EnumFontList(CFX_FontMapper* pMapper) override;
diff --git a/core/fxge/android/fx_android_impl.cpp b/core/fxge/android/fx_android_impl.cpp
index 12783f5..7883e89 100644
--- a/core/fxge/android/fx_android_impl.cpp
+++ b/core/fxge/android/fx_android_impl.cpp
@@ -29,7 +29,7 @@
       return nullptr;
 
     auto pFontInfo = std::make_unique<CFX_AndroidFontInfo>();
-    pFontInfo->Init(pFontMgr);
+    pFontInfo->Init(pFontMgr, CFX_GEModule::Get()->GetUserFontPaths());
     return pFontInfo;
   }