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.