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.