Let embedders optionally override SkFontMgr selection

Add the ability to override the hardcode SkFontMgr in
cfx_glyphcache.cpp. Do this via an optional GN target that embedders can
define. Then embedders like Chromium can implement
pdfium_skia_custom_font_manager(), and cfx_glyphcache.cpp will use that
to instantiate SkFontMgr instead of using its defaults.

The Chromium-side CL that corresponds to this CL is
https://crrev.com/c/6828742.

Change-Id: If1ddd5e383ff72cd8551911fd189d25e2beea3a5
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/134890
Commit-Queue: Lei Zhang <thestig@chromium.org>
Reviewed-by: Dominik Röttsches <drott@chromium.org>
Reviewed-by: Ben Wagner <bungeman@google.com>
diff --git a/build_overrides/pdfium.gni b/build_overrides/pdfium.gni
index aae45b1..809f94a 100644
--- a/build_overrides/pdfium.gni
+++ b/build_overrides/pdfium.gni
@@ -28,6 +28,11 @@
 # The default is to use AGG when `pdf_use_skia_override` is false.
 pdf_use_skia_override = false
 
+# When building PDFium with Skia enabled, optionally define a custom font
+# manager target that is used to override the pre-chosen font manager.
+# Default: No override. Use the pre-chosen font manager.
+pdf_skia_font_manager_target_override = ""
+
 # Build PDFium with experimental Fontations library support.
 # If enabled, coexists in build with FreeType library and the default font
 # library is selectable at runtime.
diff --git a/core/fxge/BUILD.gn b/core/fxge/BUILD.gn
index a07bcd0..933f538 100644
--- a/core/fxge/BUILD.gn
+++ b/core/fxge/BUILD.gn
@@ -122,11 +122,12 @@
   ]
 
   public_deps = []
+  defines = []
 
   if (is_component_build || use_system_freetype) {
     # ft_adobe_glyph_list is not exported from the Freetype shared library so we
     # need it defined in component builds and builds using system freetype.
-    defines = [ "DEFINE_PS_TABLES_DATA" ]
+    defines += [ "DEFINE_PS_TABLES_DATA" ]
   }
 
   if (pdf_enable_xfa) {
@@ -142,6 +143,11 @@
       "skia/fx_skia_device.cpp",
     ]
     public_deps += [ "//skia" ]
+
+    if (pdf_skia_font_manager_target != "") {
+      defines += [ "PDF_USE_SKIA_CUSTOM_FONT_MANAGER" ]
+      deps += [ pdf_skia_font_manager_target ]
+    }
   }
 
   if (is_android) {
diff --git a/core/fxge/cfx_glyphcache.cpp b/core/fxge/cfx_glyphcache.cpp
index 8d4413d..7954089 100644
--- a/core/fxge/cfx_glyphcache.cpp
+++ b/core/fxge/cfx_glyphcache.cpp
@@ -239,10 +239,25 @@
 
 #if defined(PDF_USE_SKIA)
 
+#if defined(PDF_USE_SKIA_CUSTOM_FONT_MANAGER)
+extern sk_sp<SkFontMgr> pdfium_skia_custom_font_manager();
+#endif
+
 namespace {
+
 // A singleton SkFontMgr which can be used to decode raw font data or
 // otherwise get access to system fonts.
 SkFontMgr* g_fontmgr = nullptr;
+
+sk_sp<SkFontMgr> CreateSkiaFontManager() {
+#if defined(PDF_USE_SKIA_CUSTOM_FONT_MANAGER)
+  return pdfium_skia_custom_font_manager();
+#else
+  // This is a SkFontMgr which will use FreeType to decode font data.
+  return SkFontMgr_New_Custom_Empty();
+#endif
+}
+
 }  // namespace
 
 // static
@@ -254,7 +269,7 @@
   g_fontmgr = SkFontMgr_New_CoreText(nullptr).release();
 #else
   // This is a SkFontMgr which will use FreeType to decode font data.
-  g_fontmgr = SkFontMgr_New_Custom_Empty().release();
+  g_fontmgr = CreateSkiaFontManager().release();
 #endif
 }
 
@@ -272,9 +287,9 @@
         std::make_unique<SkMemoryStream>(span.data(), span.size()));
   }
 #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_APPLE)
-  // If DirectWrite or CoreText didn't work, try FreeType.
+  // If DirectWrite or CoreText didn't work, try a fallback font manager.
   if (!typeface_) {
-    sk_sp<SkFontMgr> freetype_mgr = SkFontMgr_New_Custom_Empty();
+    sk_sp<SkFontMgr> freetype_mgr = CreateSkiaFontManager();
     pdfium::span<const uint8_t> span = font->GetFontSpan();
     typeface_ = freetype_mgr->makeFromStream(
         std::make_unique<SkMemoryStream>(span.data(), span.size()));
diff --git a/pdfium.gni b/pdfium.gni
index 544bfb2..9c8b63f 100644
--- a/pdfium.gni
+++ b/pdfium.gni
@@ -49,6 +49,13 @@
   # renderer is selectable at runtime.
   pdf_use_skia = pdf_use_skia_override
 
+  # When building PDFium with Skia enabled, use a custom font manager if there
+  # is one. The target that PDFium will depend on must implement the following
+  # C++ function signature:
+  #
+  # sk_sp<SkFontMgr> pdfium_skia_custom_font_manager();
+  pdf_skia_font_manager_target = pdf_skia_font_manager_target_override
+
   # Build PDFium with experimental Fontations library support.
   # If enabled, coexists in build with FreeType library and the default font
   # library is selectable at runtime.