Split CFX_FontMgr::GetBuiltinFont().

Split this method into GetStandardFont(), GetGenericSansFont(), and
GetGenericSerifFont(). Then all 3 well-defined methods can return spans
and there is no longer a need for absl::optional.

Along the way, consolidate some constants and split the 2 element
"mm fonts" array into a sans and a serif font.

Change-Id: Ibe9f9c5f8dd0545eb60c7083bd7e48d150af62c2
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/86450
Reviewed-by: Tom Sepez <tsepez@chromium.org>
Commit-Queue: Lei Zhang <thestig@chromium.org>
diff --git a/core/fxge/cfx_fontmapper.cpp b/core/fxge/cfx_fontmapper.cpp
index 5e894b1..53d97b1 100644
--- a/core/fxge/cfx_fontmapper.cpp
+++ b/core/fxge/cfx_fontmapper.cpp
@@ -28,11 +28,10 @@
 
 namespace {
 
-constexpr int kNumStandardFonts = 14;
-static_assert(CFX_FontMapper::kLast + 1 == kNumStandardFonts,
+static_assert(CFX_FontMapper::kLast + 1 == CFX_FontMapper::kNumStandardFonts,
               "StandardFont enum count mismatch");
 
-const char* const kBase14FontNames[kNumStandardFonts] = {
+const char* const kBase14FontNames[CFX_FontMapper::kNumStandardFonts] = {
     "Courier",
     "Courier-Bold",
     "Courier-BoldOblique",
@@ -376,34 +375,31 @@
                                                      int weight,
                                                      int pitch_family) {
   if (iBaseFont < kNumStandardFonts) {
-    if (m_FoxitFaces[iBaseFont])
-      return m_FoxitFaces[iBaseFont];
-    absl::optional<pdfium::span<const uint8_t>> font_data =
-        m_pFontMgr->GetBuiltinFont(iBaseFont);
-    if (font_data.has_value()) {
-      m_FoxitFaces[iBaseFont] =
-          m_pFontMgr->NewFixedFace(nullptr, font_data.value(), 0);
-      return m_FoxitFaces[iBaseFont];
+    if (!m_StandardFaces[iBaseFont]) {
+      m_StandardFaces[iBaseFont] = m_pFontMgr->NewFixedFace(
+          nullptr, m_pFontMgr->GetStandardFont(iBaseFont), 0);
     }
+    return m_StandardFaces[iBaseFont];
   }
+
   pSubstFont->m_bFlagMM = true;
   pSubstFont->m_ItalicAngle = italic_angle;
   if (weight)
     pSubstFont->m_Weight = weight;
   if (FontFamilyIsRoman(pitch_family)) {
     pSubstFont->UseChromeSerif();
-    if (!m_MMFaces[1]) {
-      m_MMFaces[1] = m_pFontMgr->NewFixedFace(
-          nullptr, m_pFontMgr->GetBuiltinFont(14).value(), 0);
+    if (!m_GenericSerifFace) {
+      m_GenericSerifFace = m_pFontMgr->NewFixedFace(
+          nullptr, m_pFontMgr->GetGenericSerifFont(), 0);
     }
-    return m_MMFaces[1];
+    return m_GenericSerifFace;
   }
   pSubstFont->m_Family = "Chrome Sans";
-  if (!m_MMFaces[0]) {
-    m_MMFaces[0] = m_pFontMgr->NewFixedFace(
-        nullptr, m_pFontMgr->GetBuiltinFont(15).value(), 0);
+  if (!m_GenericSansFace) {
+    m_GenericSansFace =
+        m_pFontMgr->NewFixedFace(nullptr, m_pFontMgr->GetGenericSansFont(), 0);
   }
-  return m_MMFaces[0];
+  return m_GenericSansFace;
 }
 
 RetainPtr<CFX_Face> CFX_FontMapper::FindSubstFont(const ByteString& name,
@@ -753,18 +749,6 @@
 }
 #endif  // PDF_ENABLE_XFA
 
-bool CFX_FontMapper::IsBuiltinFace(const RetainPtr<CFX_Face>& face) const {
-  for (size_t i = 0; i < MM_FACE_COUNT; ++i) {
-    if (m_MMFaces[i] == face)
-      return true;
-  }
-  for (size_t i = 0; i < FOXIT_FACE_COUNT; ++i) {
-    if (m_FoxitFaces[i] == face)
-      return true;
-  }
-  return false;
-}
-
 RetainPtr<CFX_Face> CFX_FontMapper::GetCachedTTCFace(void* hFont,
                                                      uint32_t ttc_size,
                                                      uint32_t font_size) {
diff --git a/core/fxge/cfx_fontmapper.h b/core/fxge/cfx_fontmapper.h
index 4622145..930c924 100644
--- a/core/fxge/cfx_fontmapper.h
+++ b/core/fxge/cfx_fontmapper.h
@@ -43,6 +43,7 @@
     kDingbats,
     kLast = kDingbats
   };
+  static constexpr int kNumStandardFonts = 14;
 
   explicit CFX_FontMapper(CFX_FontMgr* mgr);
   ~CFX_FontMapper();
@@ -68,7 +69,6 @@
                                     FX_CodePage code_page,
                                     CFX_SubstFont* pSubstFont);
 
-  bool IsBuiltinFace(const RetainPtr<CFX_Face>& face) const;
   size_t GetFaceSize() const;
   ByteString GetFaceName(size_t index) const { return m_FaceArray[index].name; }
   bool HasInstalledFont(ByteStringView name) const;
@@ -88,9 +88,6 @@
 #endif  // PDF_ENABLE_XFA
 
  private:
-  static constexpr size_t MM_FACE_COUNT = 2;
-  static constexpr size_t FOXIT_FACE_COUNT = 14;
-
   uint32_t GetChecksumFromTT(void* hFont);
   ByteString GetPSNameFromTT(void* hFont);
   ByteString MatchInstalledFonts(const ByteString& norm_name);
@@ -120,8 +117,9 @@
   UnownedPtr<CFX_FontMgr> const m_pFontMgr;
   std::vector<ByteString> m_InstalledTTFonts;
   std::vector<std::pair<ByteString, ByteString>> m_LocalizedTTFonts;
-  RetainPtr<CFX_Face> m_MMFaces[MM_FACE_COUNT];
-  RetainPtr<CFX_Face> m_FoxitFaces[FOXIT_FACE_COUNT];
+  RetainPtr<CFX_Face> m_StandardFaces[kNumStandardFonts];
+  RetainPtr<CFX_Face> m_GenericSansFace;
+  RetainPtr<CFX_Face> m_GenericSerifFace;
 };
 
 #endif  // CORE_FXGE_CFX_FONTMAPPER_H_
diff --git a/core/fxge/cfx_fontmgr.cpp b/core/fxge/cfx_fontmgr.cpp
index 510617f..8513001 100644
--- a/core/fxge/cfx_fontmgr.cpp
+++ b/core/fxge/cfx_fontmgr.cpp
@@ -25,7 +25,7 @@
   uint32_t m_dwSize;
 };
 
-constexpr BuiltinFont kFoxitFonts[14] = {
+constexpr BuiltinFont kFoxitFonts[] = {
     {kFoxitFixedFontData, 17597},
     {kFoxitFixedBoldFontData, 18055},
     {kFoxitFixedBoldItalicFontData, 19151},
@@ -41,11 +41,11 @@
     {kFoxitSymbolFontData, 16729},
     {kFoxitDingbatsFontData, 29513},
 };
+static_assert(pdfium::size(kFoxitFonts) == CFX_FontMapper::kNumStandardFonts,
+              "Wrong font count");
 
-const BuiltinFont kMMFonts[2] = {
-    {kFoxitSerifMMFontData, 113417},
-    {kFoxitSansMMFontData, 66919},
-};
+constexpr BuiltinFont kGenericSansFont = {kFoxitSansMMFontData, 66919};
+constexpr BuiltinFont kGenericSerifFont = {kFoxitSerifMMFontData, 113417};
 
 ByteString KeyNameFromFace(const ByteString& face_name,
                            int weight,
@@ -144,18 +144,22 @@
 }
 
 // static
-absl::optional<pdfium::span<const uint8_t>> CFX_FontMgr::GetBuiltinFont(
-    size_t index) {
-  if (index < pdfium::size(kFoxitFonts)) {
-    return pdfium::make_span(kFoxitFonts[index].m_pFontData,
-                             kFoxitFonts[index].m_dwSize);
-  }
-  size_t mm_index = index - pdfium::size(kFoxitFonts);
-  if (mm_index < pdfium::size(kMMFonts)) {
-    return pdfium::make_span(kMMFonts[mm_index].m_pFontData,
-                             kMMFonts[mm_index].m_dwSize);
-  }
-  return absl::nullopt;
+pdfium::span<const uint8_t> CFX_FontMgr::GetStandardFont(size_t index) {
+  CHECK_LT(index, pdfium::size(kFoxitFonts));
+  return pdfium::make_span(kFoxitFonts[index].m_pFontData,
+                           kFoxitFonts[index].m_dwSize);
+}
+
+// static
+pdfium::span<const uint8_t> CFX_FontMgr::GetGenericSansFont() {
+  return pdfium::make_span(kGenericSansFont.m_pFontData,
+                           kGenericSansFont.m_dwSize);
+}
+
+// static
+pdfium::span<const uint8_t> CFX_FontMgr::GetGenericSerifFont() {
+  return pdfium::make_span(kGenericSerifFont.m_pFontData,
+                           kGenericSerifFont.m_dwSize);
 }
 
 bool CFX_FontMgr::FreeTypeVersionSupportsHinting() const {
diff --git a/core/fxge/cfx_fontmgr.h b/core/fxge/cfx_fontmgr.h
index 232da1c..59cbf51 100644
--- a/core/fxge/cfx_fontmgr.h
+++ b/core/fxge/cfx_fontmgr.h
@@ -15,7 +15,6 @@
 #include "core/fxcrt/observed_ptr.h"
 #include "core/fxcrt/retain_ptr.h"
 #include "core/fxge/fx_freetype.h"
-#include "third_party/abseil-cpp/absl/types/optional.h"
 #include "third_party/base/span.h"
 
 class CFX_Face;
@@ -42,8 +41,10 @@
     ObservedPtr<CFX_Face> m_TTCFaces[16];
   };
 
-  static absl::optional<pdfium::span<const uint8_t>> GetBuiltinFont(
-      size_t index);
+  // `index` must be less than `CFX_FontMapper::kNumStandardFonts`.
+  static pdfium::span<const uint8_t> GetStandardFont(size_t index);
+  static pdfium::span<const uint8_t> GetGenericSansFont();
+  static pdfium::span<const uint8_t> GetGenericSerifFont();
 
   CFX_FontMgr();
   ~CFX_FontMgr();