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_