Split part of CPDF_TrueTypeFont into DetermineEncoding().

Refactor one chunk of LoadGlyphMap() into DetermineEncoding(). Then make
some minor improvements in DetermineEncoding():
- Break out of a for-loop early when possible.
- Reuse pre-existing constants in fx_font.cpp. Move them to fx_font.h.
- Remove an impossible check.

Change-Id: I1043882f82919053df1fc11ac734a7ce6a3e8977
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/91792
Reviewed-by: Nigi <nigi@chromium.org>
Commit-Queue: Lei Zhang <thestig@chromium.org>
diff --git a/core/fpdfapi/font/cpdf_truetypefont.cpp b/core/fpdfapi/font/cpdf_truetypefont.cpp
index ebbb92c..1fbefa3 100644
--- a/core/fpdfapi/font/cpdf_truetypefont.cpp
+++ b/core/fpdfapi/font/cpdf_truetypefont.cpp
@@ -14,6 +14,11 @@
 
 const uint8_t kPrefix[4] = {0x00, 0xf0, 0xf1, 0xf2};
 
+bool IsWinAnsiOrMacRomanEncoding(int encoding) {
+  return encoding == PDFFONT_ENCODING_WINANSI ||
+         encoding == PDFFONT_ENCODING_MACROMAN;
+}
+
 }  // namespace
 
 CPDF_TrueTypeFont::CPDF_TrueTypeFont(CPDF_Document* pDocument,
@@ -43,32 +48,8 @@
   if (!face)
     return;
 
-  int baseEncoding = m_BaseEncoding;
-  if (m_pFontFile && face->num_charmaps > 0 &&
-      (baseEncoding == PDFFONT_ENCODING_MACROMAN ||
-       baseEncoding == PDFFONT_ENCODING_WINANSI) &&
-      FontStyleIsSymbolic(m_Flags)) {
-    bool bSupportWin = false;
-    bool bSupportMac = false;
-    for (int i = 0; i < face->num_charmaps; i++) {
-      int platform_id = FXFT_Get_Charmap_PlatformID(face->charmaps[i]);
-      if (platform_id == 0 || platform_id == 3) {
-        bSupportWin = true;
-      } else if (platform_id == 0 || platform_id == 1) {
-        bSupportMac = true;
-      }
-    }
-    if (baseEncoding == PDFFONT_ENCODING_WINANSI && !bSupportWin) {
-      baseEncoding =
-          bSupportMac ? PDFFONT_ENCODING_MACROMAN : PDFFONT_ENCODING_BUILTIN;
-    } else if (baseEncoding == PDFFONT_ENCODING_MACROMAN && !bSupportMac) {
-      baseEncoding =
-          bSupportWin ? PDFFONT_ENCODING_WINANSI : PDFFONT_ENCODING_BUILTIN;
-    }
-  }
-  if (((baseEncoding == PDFFONT_ENCODING_MACROMAN ||
-        baseEncoding == PDFFONT_ENCODING_WINANSI) &&
-       m_CharNames.empty()) ||
+  const int base_encoding = DetermineEncoding();
+  if ((IsWinAnsiOrMacRomanEncoding(base_encoding) && m_CharNames.empty()) ||
       FontStyleIsNonSymbolic(m_Flags)) {
     if (!FXFT_Has_Glyph_Names(face) &&
         (!face->num_charmaps || !face->charmaps)) {
@@ -98,7 +79,7 @@
     }
     bool bToUnicode = m_pFontDict->KeyExist("ToUnicode");
     for (uint32_t charcode = 0; charcode < 256; charcode++) {
-      const char* name = GetAdobeCharName(baseEncoding, m_CharNames, charcode);
+      const char* name = GetAdobeCharName(base_encoding, m_CharNames, charcode);
       if (!name) {
         m_GlyphIndex[charcode] =
             m_pFontFile ? FT_Get_Char_Index(face, charcode) : -1;
@@ -160,10 +141,10 @@
       }
     }
     if (bFound) {
-      if (baseEncoding != PDFFONT_ENCODING_BUILTIN) {
+      if (base_encoding != PDFFONT_ENCODING_BUILTIN) {
         for (uint32_t charcode = 0; charcode < 256; charcode++) {
           const char* name =
-              GetAdobeCharName(baseEncoding, m_CharNames, charcode);
+              GetAdobeCharName(base_encoding, m_CharNames, charcode);
           if (name)
             m_Encoding.SetUnicode(charcode, PDF_UnicodeFromAdobeName(name));
         }
@@ -192,7 +173,7 @@
   }
   if (FXFT_Select_Charmap(face, FT_ENCODING_UNICODE) == 0) {
     bool bFound = false;
-    const uint16_t* pUnicodes = PDF_UnicodesForPredefinedCharSet(baseEncoding);
+    const uint16_t* pUnicodes = PDF_UnicodesForPredefinedCharSet(base_encoding);
     for (uint32_t charcode = 0; charcode < 256; charcode++) {
       if (m_pFontFile) {
         m_Encoding.SetUnicode(charcode, charcode);
@@ -214,3 +195,35 @@
   for (int charcode = 0; charcode < 256; charcode++)
     m_GlyphIndex[charcode] = charcode;
 }
+
+int CPDF_TrueTypeFont::DetermineEncoding() const {
+  if (!m_pFontFile || !FontStyleIsSymbolic(m_Flags) ||
+      !IsWinAnsiOrMacRomanEncoding(m_BaseEncoding)) {
+    return m_BaseEncoding;
+  }
+
+  // Not null - caller checked.
+  FXFT_FaceRec* face = m_Font.GetFaceRec();
+  if (face->num_charmaps <= 0)
+    return m_BaseEncoding;
+
+  bool support_win = false;
+  bool support_mac = false;
+  for (int i = 0; i < face->num_charmaps; i++) {
+    int platform_id = FXFT_Get_Charmap_PlatformID(face->charmaps[i]);
+    if (platform_id == kNamePlatformAppleUnicode ||
+        platform_id == kNamePlatformWindows) {
+      support_win = true;
+    } else if (platform_id == kNamePlatformMac) {
+      support_mac = true;
+    }
+    if (support_win && support_mac)
+      break;
+  }
+
+  if (m_BaseEncoding == PDFFONT_ENCODING_WINANSI && !support_win)
+    return support_mac ? PDFFONT_ENCODING_MACROMAN : PDFFONT_ENCODING_BUILTIN;
+  if (m_BaseEncoding == PDFFONT_ENCODING_MACROMAN && !support_mac)
+    return support_win ? PDFFONT_ENCODING_WINANSI : PDFFONT_ENCODING_BUILTIN;
+  return m_BaseEncoding;
+}
diff --git a/core/fpdfapi/font/cpdf_truetypefont.h b/core/fpdfapi/font/cpdf_truetypefont.h
index 4359478..a17a7f0 100644
--- a/core/fpdfapi/font/cpdf_truetypefont.h
+++ b/core/fpdfapi/font/cpdf_truetypefont.h
@@ -28,6 +28,8 @@
 
   // CPDF_SimpleFont:
   void LoadGlyphMap() override;
+
+  int DetermineEncoding() const;
 };
 
 #endif  // CORE_FPDFAPI_FONT_CPDF_TRUETYPEFONT_H_
diff --git a/core/fxge/fx_font.cpp b/core/fxge/fx_font.cpp
index 4f5ea68..7a35280 100644
--- a/core/fxge/fx_font.cpp
+++ b/core/fxge/fx_font.cpp
@@ -17,9 +17,7 @@
 namespace {
 
 // These numbers come from the OpenType name table specification.
-constexpr uint16_t kNamePlatformMac = 1;
 constexpr uint16_t kNameMacEncodingRoman = 0;
-constexpr uint16_t kNamePlatformWindows = 3;
 constexpr uint16_t kNameWindowsEncodingUnicode = 1;
 
 ByteString GetStringFromTable(pdfium::span<const uint8_t> string_span,
diff --git a/core/fxge/fx_font.h b/core/fxge/fx_font.h
index ca8d470..ecb539b 100644
--- a/core/fxge/fx_font.h
+++ b/core/fxge/fx_font.h
@@ -38,6 +38,11 @@
 /* Other font flags */
 #define FXFONT_USEEXTERNATTR 0x80000
 
+// These numbers come from the OpenType name table specification.
+constexpr uint16_t kNamePlatformAppleUnicode = 0;
+constexpr uint16_t kNamePlatformMac = 1;
+constexpr uint16_t kNamePlatformWindows = 3;
+
 #if defined(_SKIA_SUPPORT_) || defined(_SKIA_SUPPORT_PATHS_)
 class SkTypeface;