Remove CFX_Face::GetRec() callers from CFGAS_FontMgr

Rewrite code that access struct FT_FaceRec_ fields directly.

1) Call CFX_Face::GetFamilyName() instead of accessing family_name.
2) Change CFGAS_FontMgr::RegisterFaces() to tell RegisterFace() the
   face index, instead of retrieving the same value from face_index.
3) Add CFX_Face::GetNumFaces() to encapsulate the code that accesses
   num_faces.

Bug: 460068801
Change-Id: I2b79ee6d13fb4ef76adf07e60a58ea8690b39d46
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/138172
Reviewed-by: Tom Sepez <tsepez@chromium.org>
Commit-Queue: Lei Zhang <thestig@chromium.org>
diff --git a/core/fxge/cfx_face.cpp b/core/fxge/cfx_face.cpp
index 995affc..ecfd21f 100644
--- a/core/fxge/cfx_face.cpp
+++ b/core/fxge/cfx_face.cpp
@@ -857,6 +857,12 @@
   return !error;
 }
 
+#if defined(PDF_ENABLE_XFA)
+int CFX_Face::GetNumFaces() const {
+  return pdfium::checked_cast<int>(GetRec()->num_faces);
+}
+#endif
+
 #if BUILDFLAG(IS_WIN)
 bool CFX_Face::CanEmbed() {
   FT_UShort fstype = FT_Get_FSType_Flags(GetRec());
diff --git a/core/fxge/cfx_face.h b/core/fxge/cfx_face.h
index 64dd422..d16aeba 100644
--- a/core/fxge/cfx_face.h
+++ b/core/fxge/cfx_face.h
@@ -145,6 +145,10 @@
 
   bool SetPixelSize(uint32_t width, uint32_t height);
 
+#if defined(PDF_ENABLE_XFA)
+  int GetNumFaces() const;
+#endif
+
 #if BUILDFLAG(IS_WIN)
   bool CanEmbed();
 #endif
diff --git a/xfa/fgas/font/cfgas_fontmgr.cpp b/xfa/fgas/font/cfgas_fontmgr.cpp
index ffac5e8..6fa9dc1 100644
--- a/xfa/fgas/font/cfgas_fontmgr.cpp
+++ b/xfa/fgas/font/cfgas_fontmgr.cpp
@@ -27,7 +27,6 @@
 #include "core/fxcrt/fx_extension.h"
 #include "core/fxcrt/fx_memcpy_wrappers.h"
 #include "core/fxcrt/fx_system.h"
-#include "core/fxcrt/numerics/safe_conversions.h"
 #include "core/fxcrt/span.h"
 #include "core/fxcrt/stl_util.h"
 #include "core/fxge/cfx_font.h"
@@ -706,6 +705,7 @@
 }
 
 void CFGAS_FontMgr::RegisterFace(RetainPtr<CFX_Face> face,
+                                 int face_index,
                                  const WideString& wsFaceName) {
   if (!face->IsScalable()) {
     return;
@@ -743,27 +743,29 @@
   }
   font->family_names_ = GetNames(table);
   font->family_names_.push_back(
-      WideString::FromUTF8(face->GetRec()->family_name));
+      WideString::FromUTF8(face->GetFamilyName().AsStringView()));
   font->face_name_ = wsFaceName;
-  font->face_index_ = pdfium::checked_cast<int32_t>(face->GetRec()->face_index);
+  font->face_index_ = face_index;
   installed_fonts_.push_back(std::move(font));
 }
 
 void CFGAS_FontMgr::RegisterFaces(
     const RetainPtr<IFX_SeekableReadStream>& font_stream,
     const WideString& wsFaceName) {
-  int32_t index = 0;
-  int32_t num_faces = 0;
+  int index = 0;
+  int num_faces = 0;
   do {
-    RetainPtr<CFX_Face> face = LoadFace(font_stream, index++);
+    RetainPtr<CFX_Face> face = LoadFace(font_stream, index);
     if (!face) {
+      ++index;
       continue;
     }
     // All faces keep number of faces. It can be retrieved from any one face.
     if (num_faces == 0) {
-      num_faces = pdfium::checked_cast<int32_t>(face->GetRec()->num_faces);
+      num_faces = face->GetNumFaces();
     }
-    RegisterFace(face, wsFaceName);
+    RegisterFace(face, index, wsFaceName);
+    ++index;
   } while (index < num_faces);
 }
 
diff --git a/xfa/fgas/font/cfgas_fontmgr.h b/xfa/fgas/font/cfgas_fontmgr.h
index 85b84f9..5c6fc4d 100644
--- a/xfa/fgas/font/cfgas_fontmgr.h
+++ b/xfa/fgas/font/cfgas_fontmgr.h
@@ -121,7 +121,9 @@
 
 #else   // BUILDFLAG(IS_WIN)
   bool EnumFontsFromFontMapper();
-  void RegisterFace(RetainPtr<CFX_Face> face, const WideString& wsFaceName);
+  void RegisterFace(RetainPtr<CFX_Face> face,
+                    int face_index,
+                    const WideString& wsFaceName);
   void RegisterFaces(const RetainPtr<IFX_SeekableReadStream>& font_stream,
                      const WideString& wsFaceName);
   std::vector<CFGAS_FontDescriptorInfo> MatchFonts(FX_CodePage wCodePage,