Split and move Skia font tables to CFX_AndroidFontInfo Mechanically move Skia font tables, constants, and helper functions from CFPF_SkiaFontMgr to CFX_AndroidFontInfo. Expose the necessary helper functions and table getters in cfx_androidfontinfo.h to allow CFPF_SkiaFontMgr to continue using them temporarily. This is a preparatory step to simplify the transition of CFX_AndroidFontInfo to inherit from CFX_FolderFontInfo and remove CFPF_SkiaFontMgr. -- Pass tables back to old code as spans. TAG=agy CONV=9eb75345-7937-424f-b361-4fdfac3d86a7 Change-Id: Iedad112f2d1de8039e4cba198730305ccd1f2da5 Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/149870 Reviewed-by: Lei Zhang <thestig@chromium.org> Commit-Queue: Tom Sepez <tsepez@chromium.org>
diff --git a/core/fxge/android/cfpf_skiafontmgr.cpp b/core/fxge/android/cfpf_skiafontmgr.cpp index 516b52d..477f8e4 100644 --- a/core/fxge/android/cfpf_skiafontmgr.cpp +++ b/core/fxge/android/cfpf_skiafontmgr.cpp
@@ -21,105 +21,20 @@ #include "core/fxcrt/fx_system.h" #include "core/fxcrt/mapped_data_bytes.h" #include "core/fxge/android/cfpf_skiafont.h" +#include "core/fxge/android/cfx_androidfontinfo.h" #include "core/fxge/cfx_fontmgr.h" #include "core/fxge/fx_font.h" namespace { -constexpr char kRoboto[] = "Roboto"; -constexpr char kDroidSans[] = "Droid Sans"; -constexpr char kDroidSerif[] = "Droid Serif"; -constexpr char kDroidSansMono[] = "Droid Sans Mono"; -constexpr char kDroidSansFallback[] = "Droid Sans Fallback"; -// Repeat the function from bytestring.cpp here, so it can be used in -// a constexpr context. Then make the compiler prove the mappings are -// correct. -constexpr uint32_t HashNormalizeFontName(const char* family) { - uint32_t hash_code = 0; - UNSAFE_BUFFERS({ - for (size_t i = 0; family[i] != '\0'; ++i) { - char ch = family[i]; - if (ch == ' ' || ch == '-' || ch == ',') { - continue; - } - hash_code = 31 * hash_code + FXSYS_ToLowerASCII(ch); - } - }); - return hash_code; -} - -static_assert(HashNormalizeFontName("Arial") == 0x058c5083); -static_assert(HashNormalizeFontName("Baskerville") == 0x3d49f40e); -static_assert(HashNormalizeFontName("Courier New") == 0x83746053); -static_assert(HashNormalizeFontName("Courier") == 0x3918fe2d); -static_assert(HashNormalizeFontName("Cursive") == 0x432c41c5); -static_assert(HashNormalizeFontName("Fantasy") == 0xbf85ff26); -static_assert(HashNormalizeFontName("Georgia") == 0xfb4ce0de); -static_assert(HashNormalizeFontName("Goudy") == 0x05dfade2); -static_assert(HashNormalizeFontName("Monaco") == 0xc04fe601); -static_assert(HashNormalizeFontName("Monospace") == 0xaaa60c03); -static_assert(HashNormalizeFontName("Palatino") == 0x3b98b31c); -static_assert(HashNormalizeFontName("STSong") == 0xcad5eaf6); -static_assert(HashNormalizeFontName("Sanserif") == 0x779ce19d); -static_assert(HashNormalizeFontName("Serif") == 0x0684317d); -static_assert(HashNormalizeFontName("SimHei") == 0xca3812d5); -static_assert(HashNormalizeFontName("SimSun") == 0xca383e15); -static_assert(HashNormalizeFontName("Tahoma") == 0xcb7a04c8); -static_assert(HashNormalizeFontName("Verdana") == 0x14ee2d13); constexpr int kSkiaMatchNameWeight = 62; constexpr int kSkiaMatchSystemNameWeight = 60; constexpr int kSkiaMatchSerifStyleWeight = 16; constexpr int kSkiaMatchScriptStyleWeight = 8; -struct SkiaFontMap { - uint32_t family; - const char* subst; -}; -const SkiaFontMap kSkiaFontmap[] = { - {0x058c5083, kRoboto}, // Arial - {0x05dfade2, kDroidSerif}, // Goudy - {0x0684317d, kDroidSerif}, // Serif - {0x14ee2d13, kRoboto}, // Verdana - {0x3918fe2d, kDroidSansMono}, // Courier - {0x3b98b31c, kDroidSerif}, // Palatino - {0x3d49f40e, kDroidSerif}, // Baskerville - {0x432c41c5, kDroidSerif}, // Cursive - {0x491b6ad0, kDroidSerif}, // Unknown - {0x5612cab1, kDroidSansFallback}, // Unknown - {0x779ce19d, kRoboto}, // Sanserif - {0x7cc9510b, kDroidSansFallback}, // Unknown - {0x83746053, kDroidSansMono}, // Courier New - {0xaaa60c03, kDroidSansMono}, // Monospace - {0xbf85ff26, kDroidSerif}, // Fantasy - {0xc04fe601, kDroidSansMono}, // Monaco - {0xca3812d5, kDroidSansFallback}, // SimHei - {0xca383e15, kDroidSansFallback}, // SimSun - {0xcad5eaf6, kDroidSansFallback}, // STSong - {0xcb7a04c8, kRoboto}, // Tahoma - {0xfb4ce0de, kDroidSerif}, // Georgia -}; - -const SkiaFontMap kSkiaSansFontMap[] = { - {0x058c5083, kDroidSans}, // Arial - {0x14ee2d13, kDroidSans}, // Verdana - {0x779ce19d, kDroidSans}, // Sanserif - {0xcb7a04c8, kDroidSans}, // Tahoma - {0xfb4ce0de, kDroidSans}, // Georgia -}; - -const char* SkiaGetSubstFont(uint32_t hash, - pdfium::span<const SkiaFontMap> font_map) { - const SkiaFontMap* it = std::ranges::lower_bound( - font_map, hash, std::less<>{}, &SkiaFontMap::family); - - if (it != font_map.end() && it->family == hash) { - return it->subst; - } - return nullptr; -} // Map from OS/2 table ulCodePageRange1 bits (0-31) to FX_CharsetFlag. // See https://learn.microsoft.com/en-us/typography/opentype/spec/os2 @@ -171,17 +86,6 @@ return charsets; } -uint32_t SkiaNormalizeFontName(ByteStringView family) { - uint32_t hash_code = 0; - for (unsigned char ch : family) { - if (ch == ' ' || ch == '-' || ch == ',') { - continue; - } - hash_code = 31 * hash_code + tolower(ch); - } - return hash_code; -} - uint32_t GetFamilyHash(ByteStringView family, uint32_t style, FX_Charset charset) { @@ -203,17 +107,7 @@ return FX_CharSetIsCJK(charset); } -bool SkiaMaybeSymbol(ByteStringView facename) { - ByteString name(facename); - name.MakeLower(); - return name.Contains("symbol"); -} -bool SkiaMaybeArabic(ByteStringView facename) { - ByteString name(facename); - name.MakeLower(); - return name.Contains("arabic"); -} } // namespace @@ -254,9 +148,9 @@ } const uint32_t face_name_hash = SkiaNormalizeFontName(family_name); - const char* subst_name = SkiaGetSubstFont(face_name_hash, kSkiaFontmap); + const char* subst_name = SkiaGetSubstFont(face_name_hash, GetSkiaFontmap()); const char* subst_sans_name = - SkiaGetSubstFont(face_name_hash, kSkiaSansFontMap); + SkiaGetSubstFont(face_name_hash, GetSkiaSansFontMap()); const uint32_t subst_hash = subst_name ? SkiaNormalizeFontName(subst_name) : 0; const uint32_t subst_sans_hash =
diff --git a/core/fxge/android/cfx_androidfontinfo.cpp b/core/fxge/android/cfx_androidfontinfo.cpp index 416d4f9..9c9b095 100644 --- a/core/fxge/android/cfx_androidfontinfo.cpp +++ b/core/fxge/android/cfx_androidfontinfo.cpp
@@ -6,12 +6,137 @@ #include "core/fxge/android/cfx_androidfontinfo.h" +#include <algorithm> +#include <functional> + +#include "core/fxcrt/compiler_specific.h" +#include "core/fxcrt/fx_extension.h" #include "core/fxcrt/fx_system.h" #include "core/fxge/android/cfpf_skiafont.h" #include "core/fxge/android/cfpf_skiafontmgr.h" #include "core/fxge/cfx_fontmapper.h" #include "core/fxge/fx_font.h" +namespace { + +constexpr char kRoboto[] = "Roboto"; +constexpr char kDroidSans[] = "Droid Sans"; +constexpr char kDroidSerif[] = "Droid Serif"; +constexpr char kDroidSansMono[] = "Droid Sans Mono"; +constexpr char kDroidSansFallback[] = "Droid Sans Fallback"; + +// Repeat the function from bytestring.cpp here, so it can be used in +// a constexpr context. Then make the compiler prove the mappings are +// correct. +constexpr uint32_t HashNormalizeFontName(const char* family) { + uint32_t hash_code = 0; + UNSAFE_BUFFERS({ + for (size_t i = 0; family[i] != '\0'; ++i) { + char ch = family[i]; + if (ch == ' ' || ch == '-' || ch == ',') { + continue; + } + hash_code = 31 * hash_code + FXSYS_ToLowerASCII(ch); + } + }); + return hash_code; +} + +static_assert(HashNormalizeFontName("Arial") == 0x058c5083); +static_assert(HashNormalizeFontName("Baskerville") == 0x3d49f40e); +static_assert(HashNormalizeFontName("Courier New") == 0x83746053); +static_assert(HashNormalizeFontName("Courier") == 0x3918fe2d); +static_assert(HashNormalizeFontName("Cursive") == 0x432c41c5); +static_assert(HashNormalizeFontName("Fantasy") == 0xbf85ff26); +static_assert(HashNormalizeFontName("Georgia") == 0xfb4ce0de); +static_assert(HashNormalizeFontName("Goudy") == 0x05dfade2); +static_assert(HashNormalizeFontName("Monaco") == 0xc04fe601); +static_assert(HashNormalizeFontName("Monospace") == 0xaaa60c03); +static_assert(HashNormalizeFontName("Palatino") == 0x3b98b31c); +static_assert(HashNormalizeFontName("STSong") == 0xcad5eaf6); +static_assert(HashNormalizeFontName("Sanserif") == 0x779ce19d); +static_assert(HashNormalizeFontName("Serif") == 0x0684317d); +static_assert(HashNormalizeFontName("SimHei") == 0xca3812d5); +static_assert(HashNormalizeFontName("SimSun") == 0xca383e15); +static_assert(HashNormalizeFontName("Tahoma") == 0xcb7a04c8); +static_assert(HashNormalizeFontName("Verdana") == 0x14ee2d13); + +const SkiaFontMap kSkiaFontmap[] = { + {0x058c5083, kRoboto}, // Arial + {0x05dfade2, kDroidSerif}, // Goudy + {0x0684317d, kDroidSerif}, // Serif + {0x14ee2d13, kRoboto}, // Verdana + {0x3918fe2d, kDroidSansMono}, // Courier + {0x3b98b31c, kDroidSerif}, // Palatino + {0x3d49f40e, kDroidSerif}, // Baskerville + {0x432c41c5, kDroidSerif}, // Cursive + {0x491b6ad0, kDroidSerif}, // Unknown + {0x5612cab1, kDroidSansFallback}, // Unknown + {0x779ce19d, kRoboto}, // Sanserif + {0x7cc9510b, kDroidSansFallback}, // Unknown + {0x83746053, kDroidSansMono}, // Courier New + {0xaaa60c03, kDroidSansMono}, // Monospace + {0xbf85ff26, kDroidSerif}, // Fantasy + {0xc04fe601, kDroidSansMono}, // Monaco + {0xca3812d5, kDroidSansFallback}, // SimHei + {0xca383e15, kDroidSansFallback}, // SimSun + {0xcad5eaf6, kDroidSansFallback}, // STSong + {0xcb7a04c8, kRoboto}, // Tahoma + {0xfb4ce0de, kDroidSerif}, // Georgia +}; + +const SkiaFontMap kSkiaSansFontMap[] = { + {0x058c5083, kDroidSans}, // Arial + {0x14ee2d13, kDroidSans}, // Verdana + {0x779ce19d, kDroidSans}, // Sanserif + {0xcb7a04c8, kDroidSans}, // Tahoma + {0xfb4ce0de, kDroidSans}, // Georgia +}; + +} // namespace + +pdfium::span<const SkiaFontMap> GetSkiaFontmap() { + return kSkiaFontmap; +} + +pdfium::span<const SkiaFontMap> GetSkiaSansFontMap() { + return kSkiaSansFontMap; +} + +uint32_t SkiaNormalizeFontName(ByteStringView family) { + uint32_t hash_code = 0; + for (char ch : family) { + if (ch == ' ' || ch == '-' || ch == ',') { + continue; + } + hash_code = 31 * hash_code + FXSYS_ToLowerASCII(ch); + } + return hash_code; +} + +const char* SkiaGetSubstFont(uint32_t hash, + pdfium::span<const SkiaFontMap> font_map) { + auto it = std::ranges::lower_bound(font_map, hash, std::less<>{}, + &SkiaFontMap::family); + + if (it != font_map.end() && it->family == hash) { + return it->subst; + } + return nullptr; +} + +bool SkiaMaybeArabic(ByteStringView facename) { + ByteString name(facename); + name.MakeLower(); + return name.Contains("arabic"); +} + +bool SkiaMaybeSymbol(ByteStringView facename) { + ByteString name(facename); + name.MakeLower(); + return name.Contains("symbol"); +} + CFX_AndroidFontInfo::CFX_AndroidFontInfo() = default; CFX_AndroidFontInfo::~CFX_AndroidFontInfo() = default;
diff --git a/core/fxge/android/cfx_androidfontinfo.h b/core/fxge/android/cfx_androidfontinfo.h index 3c287fe..1de0cb9 100644 --- a/core/fxge/android/cfx_androidfontinfo.h +++ b/core/fxge/android/cfx_androidfontinfo.h
@@ -9,6 +9,7 @@ #include <stdint.h> +#include "core/fxcrt/bytestring.h" #include "core/fxcrt/span.h" #include "core/fxcrt/unowned_ptr.h" #include "core/fxge/cfx_fontmapper.h" @@ -42,4 +43,18 @@ UnownedPtr<CFPF_SkiaFontMgr> font_mgr_; }; +struct SkiaFontMap { + uint32_t family; + const char* subst; +}; + +pdfium::span<const SkiaFontMap> GetSkiaFontmap(); +pdfium::span<const SkiaFontMap> GetSkiaSansFontMap(); + +uint32_t SkiaNormalizeFontName(ByteStringView family); +const char* SkiaGetSubstFont(uint32_t hash, + pdfium::span<const SkiaFontMap> font_map); +bool SkiaMaybeArabic(ByteStringView facename); +bool SkiaMaybeSymbol(ByteStringView facename); + #endif // CORE_FXGE_ANDROID_CFX_ANDROIDFONTINFO_H_