Update the list of Traditional Chinese fonts to try on Windows. When trying to select a Traditional Chinese substitute font on Windows, currently the only font being considered is MingLiu/PMingLiu. This font is not installed by default on Windows 10 in many non-Chinese locales, so font substitution will most likely fail. Work around this by also considering the Microsoft YaHei/JHengHei fonts. This is the same strategy used in Chromium in their third_party/blink/renderer/platform/fonts/win/font_fallback_win.cc. Bug: chromium:908691 Change-Id: Id036b81b38028e62b83f26dd46e6d76540ab9194 Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/95352 Reviewed-by: Nigi <nigi@chromium.org> Commit-Queue: Lei Zhang <thestig@chromium.org>
diff --git a/core/fxge/win32/cwin32_platform.cpp b/core/fxge/win32/cwin32_platform.cpp index 1f3f7b7..ced4ba1 100644 --- a/core/fxge/win32/cwin32_platform.cpp +++ b/core/fxge/win32/cwin32_platform.cpp
@@ -13,7 +13,9 @@ #include "core/fxcrt/fx_codepage.h" #include "core/fxge/cfx_folderfontinfo.h" #include "core/fxge/cfx_gemodule.h" +#include "third_party/base/check.h" #include "third_party/base/numerics/safe_conversions.h" +#include "third_party/base/span.h" #include "third_party/base/win/scoped_select_object.h" #include "third_party/base/win/win_util.h" @@ -123,6 +125,11 @@ void GetGBPreference(ByteString& face, int weight, int pitch_family); void GetJapanesePreference(ByteString& face, int weight, int pitch_family); ByteString FindFont(const ByteString& name); + void* GetFontFromList(int weight, + bool italic, + FX_Charset charset, + int pitch_family, + pdfium::span<const char* const> font_faces); const HDC m_hDC; UnownedPtr<CFX_FontMapper> m_pMapper; @@ -214,6 +221,26 @@ return ByteString(); } +void* CFX_Win32FontInfo::GetFontFromList( + int weight, + bool italic, + FX_Charset charset, + int pitch_family, + pdfium::span<const char* const> font_faces) { + DCHECK(!font_faces.empty()); + + // Initialization not needed because of DCHECK() above and the assignment in + // the for-loop below. + HFONT font; + for (const char* face : font_faces) { + font = Win32CreateFont(weight, italic, charset, pitch_family, face); + ByteString actual_face; + if (GetFaceName(font, &actual_face) && actual_face.EqualNoCase(face)) + break; + } + return font; +} + void* CFX_Win32FallbackFontInfo::MapFont(int weight, bool bItalic, FX_Charset charset, @@ -367,12 +394,14 @@ new_face = "Gulim"; break; case FX_Charset::kChineseTraditional: - if (new_face.Contains("MSung")) { - new_face = "MingLiU"; - } else { - new_face = "PMingLiU"; - } - break; + static const char* const kMonospaceFonts[] = {"Microsoft YaHei", + "MingLiU"}; + static const char* const kProportionalFonts[] = {"Microsoft JHengHei", + "PMingLiU"}; + pdfium::span<const char* const> candidate_fonts = + new_face.Contains("MSung") ? kMonospaceFonts : kProportionalFonts; + return GetFontFromList(weight, bItalic, charset, subst_pitch_family, + candidate_fonts); } return Win32CreateFont(weight, bItalic, charset, subst_pitch_family, new_face.c_str());