Add enum class fxge::FontEncoding

This enum class's values are the same as FreeType's. Use it in place of
FT_ENCODING_* in the code base. Also replace the existing constants in
cfx_unicodeencodingex.cpp.

Bug: pdfium:2037
Change-Id: I09d1c232b881d544b526f128f2aacc06c448a582
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/114771
Reviewed-by: Tom Sepez <tsepez@chromium.org>
Commit-Queue: Lei Zhang <thestig@chromium.org>
diff --git a/core/fpdfapi/font/cpdf_cidfont.cpp b/core/fpdfapi/font/cpdf_cidfont.cpp
index f9beb2f..932a79d 100644
--- a/core/fpdfapi/font/cpdf_cidfont.cpp
+++ b/core/fpdfapi/font/cpdf_cidfont.cpp
@@ -195,26 +195,27 @@
 #endif  // !BUILDFLAG(IS_WIN)
 
 void FT_UseCIDCharmap(FXFT_FaceRec* face, CIDCoding coding) {
-  int encoding;
+  fxge::FontEncoding encoding;
   switch (coding) {
     case CIDCoding::kGB:
-      encoding = FT_ENCODING_GB2312;
+      encoding = fxge::FontEncoding::kGB2312;
       break;
     case CIDCoding::kBIG5:
-      encoding = FT_ENCODING_BIG5;
+      encoding = fxge::FontEncoding::kBig5;
       break;
     case CIDCoding::kJIS:
-      encoding = FT_ENCODING_SJIS;
+      encoding = fxge::FontEncoding::kSjis;
       break;
     case CIDCoding::kKOREA:
-      encoding = FT_ENCODING_JOHAB;
+      encoding = fxge::FontEncoding::kJohab;
       break;
     default:
-      encoding = FT_ENCODING_UNICODE;
+      encoding = fxge::FontEncoding::kUnicode;
   }
   int err = FXFT_Select_Charmap(face, encoding);
   if (err)
-    err = FXFT_Select_Charmap(face, FT_ENCODING_UNICODE);
+    err = FXFT_Select_Charmap(
+        face, static_cast<FT_Encoding>(fxge::FontEncoding::kUnicode));
   if (err && face->charmaps)
     FT_Set_Charmap(face, face->charmaps[0]);
 }
@@ -469,7 +470,9 @@
   }
   if (m_Font.GetFaceRec()) {
     if (m_FontType == CIDFontType::kType1)
-      FXFT_Select_Charmap(m_Font.GetFaceRec(), FT_ENCODING_UNICODE);
+      FXFT_Select_Charmap(
+          m_Font.GetFaceRec(),
+          static_cast<FT_Encoding>(fxge::FontEncoding::kUnicode));
     else
       FT_UseCIDCharmap(m_Font.GetFaceRec(), m_pCMap->GetCoding());
   }
@@ -744,8 +747,8 @@
         index = FT_Get_Char_Index(face, name_unicode);
       } else {
         DCHECK_EQ(base_encoding, FontEncoding::kMacRoman);
-        uint32_t maccode = CharCodeFromUnicodeForFreetypeEncoding(
-            FT_ENCODING_APPLE_ROMAN, name_unicode);
+        uint32_t maccode = CharCodeFromUnicodeForEncoding(
+            fxge::FontEncoding::kAppleRoman, name_unicode);
         index = maccode ? FT_Get_Char_Index(face, maccode)
                         : FT_Get_Name_Index(face, name);
       }
@@ -765,12 +768,14 @@
     if (!face)
       return unicode;
 
-    int err = FXFT_Select_Charmap(face, FT_ENCODING_UNICODE);
+    int err = FXFT_Select_Charmap(
+        face, static_cast<FT_Encoding>(fxge::FontEncoding::kUnicode));
     if (err) {
       int i;
       for (i = 0; i < face->num_charmaps; i++) {
-        uint32_t ret = CharCodeFromUnicodeForFreetypeEncoding(
-            FXFT_Get_Charmap_Encoding(face->charmaps[i]),
+        uint32_t ret = CharCodeFromUnicodeForEncoding(
+            static_cast<fxge::FontEncoding>(
+                FXFT_Get_Charmap_Encoding(face->charmaps[i])),
             static_cast<wchar_t>(charcode));
         if (ret == 0)
           continue;
@@ -804,7 +809,8 @@
     if (!charmap || m_pCMap->GetCoding() == CIDCoding::kUNKNOWN)
       return cid;
 
-    if (FXFT_Get_Charmap_Encoding(charmap) == FT_ENCODING_UNICODE) {
+    if (FXFT_Get_Charmap_Encoding(charmap) ==
+        static_cast<FT_Encoding>(fxge::FontEncoding::kUnicode)) {
       WideString unicode_str = UnicodeFromCharCode(charcode);
       if (unicode_str.IsEmpty())
         return -1;
diff --git a/core/fpdfapi/font/cpdf_fontencoding.cpp b/core/fpdfapi/font/cpdf_fontencoding.cpp
index 9ac25aa..7ed59c0 100644
--- a/core/fpdfapi/font/cpdf_fontencoding.cpp
+++ b/core/fpdfapi/font/cpdf_fontencoding.cpp
@@ -14,8 +14,8 @@
 #include "core/fpdfapi/parser/cpdf_name.h"
 #include "core/fpdfapi/parser/cpdf_number.h"
 #include "core/fpdfapi/parser/fpdf_parser_decode.h"
-#include "core/fxge/freetype/fx_freetype.h"
 #include "core/fxge/fx_font.h"
+#include "core/fxge/fx_fontencoding.h"
 #include "third_party/abseil-cpp/absl/types/optional.h"
 
 namespace {
@@ -1735,24 +1735,26 @@
   return pDict;
 }
 
-uint32_t CharCodeFromUnicodeForFreetypeEncoding(int encoding, wchar_t unicode) {
+uint32_t CharCodeFromUnicodeForEncoding(fxge::FontEncoding encoding,
+                                        wchar_t unicode) {
   switch (encoding) {
-    case FT_ENCODING_UNICODE:
+    case fxge::FontEncoding::kUnicode:
       return unicode;
-    case FT_ENCODING_ADOBE_STANDARD:
+    case fxge::FontEncoding::kAdobeStandard:
       return PDF_FindCode(kStandardEncoding, unicode);
-    case FT_ENCODING_ADOBE_EXPERT:
+    case fxge::FontEncoding::kAdobeExpert:
       return PDF_FindCode(kMacExpertEncoding, unicode);
-    case FT_ENCODING_ADOBE_LATIN_1:
+    case fxge::FontEncoding::kLatin1:
       return PDF_FindCode(kAdobeWinAnsiEncoding, unicode);
-    case FT_ENCODING_APPLE_ROMAN:
+    case fxge::FontEncoding::kAppleRoman:
       return PDF_FindCode(kMacRomanEncoding, unicode);
-    case FT_ENCODING_ADOBE_CUSTOM:
+    case fxge::FontEncoding::kAdobeCustom:
       return PDF_FindCode(kPDFDocEncoding, unicode);
-    case FT_ENCODING_MS_SYMBOL:
+    case fxge::FontEncoding::kSymbol:
       return PDF_FindCode(kMSSymbolEncoding, unicode);
+    default:
+      return 0;
   }
-  return 0;
 }
 
 wchar_t UnicodeFromAppleRomanCharCode(uint8_t charcode) {
diff --git a/core/fpdfapi/font/cpdf_fontencoding.h b/core/fpdfapi/font/cpdf_fontencoding.h
index 3553400..c0a5e6c 100644
--- a/core/fpdfapi/font/cpdf_fontencoding.h
+++ b/core/fpdfapi/font/cpdf_fontencoding.h
@@ -11,6 +11,7 @@
 #include "core/fxcrt/retain_ptr.h"
 #include "core/fxcrt/string_pool_template.h"
 #include "core/fxcrt/weak_ptr.h"
+#include "core/fxge/fx_fontencoding.h"
 #include "third_party/base/containers/span.h"
 
 enum class FontEncoding {
@@ -25,7 +26,13 @@
   kMsSymbol = 8,
 };
 
-uint32_t CharCodeFromUnicodeForFreetypeEncoding(int encoding, wchar_t unicode);
+// For `encoding`, the caller can safely cast any FreeType FT_ENCODING_* value
+// into fxge::FontEncoding.
+// TODO(crbug.com/pdfium/2037): Always pass in fxge::FontEncoding values and
+// remove this comment.
+uint32_t CharCodeFromUnicodeForEncoding(fxge::FontEncoding encoding,
+                                        wchar_t unicode);
+
 wchar_t UnicodeFromAppleRomanCharCode(uint8_t charcode);
 
 pdfium::span<const uint16_t> UnicodesForPredefinedCharSet(
diff --git a/core/fpdfapi/font/cpdf_truetypefont.cpp b/core/fpdfapi/font/cpdf_truetypefont.cpp
index 5a01950..e090a25 100644
--- a/core/fpdfapi/font/cpdf_truetypefont.cpp
+++ b/core/fpdfapi/font/cpdf_truetypefont.cpp
@@ -86,8 +86,8 @@
           m_GlyphIndex[charcode] =
               FT_Get_Char_Index(face, m_Encoding.UnicodeFromCharCode(charcode));
         } else if (charmap_type == CharmapType::kMacRoman) {
-          uint32_t maccode = CharCodeFromUnicodeForFreetypeEncoding(
-              FT_ENCODING_APPLE_ROMAN,
+          uint32_t maccode = CharCodeFromUnicodeForEncoding(
+              fxge::FontEncoding::kAppleRoman,
               m_Encoding.UnicodeFromCharCode(charcode));
           if (!maccode) {
             m_GlyphIndex[charcode] = FT_Get_Name_Index(face, name);
@@ -144,7 +144,8 @@
     if (m_pFontFile || HasAnyGlyphIndex())
       return;
   }
-  if (FXFT_Select_Charmap(face, FT_ENCODING_UNICODE) == 0) {
+  if (FXFT_Select_Charmap(
+          face, static_cast<FT_Encoding>(fxge::FontEncoding::kUnicode)) == 0) {
     pdfium::span<const uint16_t> unicodes =
         UnicodesForPredefinedCharSet(base_encoding);
     for (uint32_t charcode = 0; charcode < 256; charcode++) {
diff --git a/core/fpdfapi/font/cpdf_type1font.cpp b/core/fpdfapi/font/cpdf_type1font.cpp
index 55510e7..5e33da4 100644
--- a/core/fpdfapi/font/cpdf_type1font.cpp
+++ b/core/fpdfapi/font/cpdf_type1font.cpp
@@ -53,7 +53,8 @@
     return false;
 
   bool is_first_charmap_unicode =
-      FXFT_Get_Charmap_Encoding(face->charmaps[0]) == FT_ENCODING_UNICODE;
+      FXFT_Get_Charmap_Encoding(face->charmaps[0]) ==
+      static_cast<FT_Encoding>(fxge::FontEncoding::kUnicode);
   if (face->num_charmaps == 1 && is_first_charmap_unicode)
     return false;
 
@@ -165,7 +166,8 @@
         return;
       }
     }
-    FXFT_Select_Charmap(m_Font.GetFaceRec(), FT_ENCODING_UNICODE);
+    FXFT_Select_Charmap(m_Font.GetFaceRec(),
+                        static_cast<FT_Encoding>(fxge::FontEncoding::kUnicode));
     if (m_BaseEncoding == FontEncoding::kBuiltin)
       m_BaseEncoding = FontEncoding::kStandard;
 
@@ -225,7 +227,9 @@
     }
 
     bool bUnicode =
-        FXFT_Select_Charmap(m_Font.GetFaceRec(), FT_ENCODING_UNICODE) == 0;
+        FXFT_Select_Charmap(
+            m_Font.GetFaceRec(),
+            static_cast<FT_Encoding>(fxge::FontEncoding::kUnicode)) == 0;
     for (uint32_t charcode = 0; charcode < kInternalTableSize; charcode++) {
       const char* name =
           GetAdobeCharName(m_BaseEncoding, m_CharNames, charcode);
@@ -286,7 +290,9 @@
   }
 
   bool bUnicode =
-      FXFT_Select_Charmap(m_Font.GetFaceRec(), FT_ENCODING_UNICODE) == 0;
+      FXFT_Select_Charmap(
+          m_Font.GetFaceRec(),
+          static_cast<FT_Encoding>(fxge::FontEncoding::kUnicode)) == 0;
   for (size_t charcode = 0; charcode < kInternalTableSize; charcode++) {
     const char* name = GetAdobeCharName(m_BaseEncoding, m_CharNames,
                                         static_cast<uint32_t>(charcode));
diff --git a/core/fxge/BUILD.gn b/core/fxge/BUILD.gn
index f647432..b7b1b0d 100644
--- a/core/fxge/BUILD.gn
+++ b/core/fxge/BUILD.gn
@@ -98,6 +98,8 @@
     "freetype/fx_freetype.h",
     "fx_font.cpp",
     "fx_font.h",
+    "fx_fontencoding.cpp",
+    "fx_fontencoding.h",
     "render_defines.h",
     "renderdevicedriver_iface.cpp",
     "renderdevicedriver_iface.h",
diff --git a/core/fxge/android/cfpf_skiafont.cpp b/core/fxge/android/cfpf_skiafont.cpp
index 47423e5..ab6ca81 100644
--- a/core/fxge/android/cfpf_skiafont.cpp
+++ b/core/fxge/android/cfpf_skiafont.cpp
@@ -14,6 +14,7 @@
 #include "core/fxge/android/cfpf_skiafontmgr.h"
 #include "core/fxge/android/cfpf_skiapathfont.h"
 #include "core/fxge/freetype/fx_freetype.h"
+#include "core/fxge/fx_fontencoding.h"
 #include "third_party/base/numerics/safe_conversions.h"
 
 #define FPF_EM_ADJUST(em, a) (em == 0 ? (a) : (a)*1000 / em)
@@ -45,8 +46,10 @@
 int32_t CFPF_SkiaFont::GetGlyphIndex(wchar_t wUnicode) {
   if (!m_Face)
     return wUnicode;
-  if (FXFT_Select_Charmap(GetFaceRec(), FT_ENCODING_UNICODE))
+  if (FXFT_Select_Charmap(GetFaceRec(), static_cast<FT_Encoding>(
+                                            fxge::FontEncoding::kUnicode))) {
     return 0;
+  }
   return FT_Get_Char_Index(GetFaceRec(), wUnicode);
 }
 
diff --git a/core/fxge/cfx_unicodeencoding.cpp b/core/fxge/cfx_unicodeencoding.cpp
index b8f818a..309ba4a 100644
--- a/core/fxge/cfx_unicodeencoding.cpp
+++ b/core/fxge/cfx_unicodeencoding.cpp
@@ -11,6 +11,7 @@
 #include "core/fxge/cfx_substfont.h"
 #include "core/fxge/freetype/fx_freetype.h"
 #include "core/fxge/fx_font.h"
+#include "core/fxge/fx_fontencoding.h"
 
 CFX_UnicodeEncoding::CFX_UnicodeEncoding(const CFX_Font* pFont)
     : m_pFont(pFont) {}
@@ -22,16 +23,23 @@
   if (!face)
     return charcode;
 
-  if (FT_Select_Charmap(face, FT_ENCODING_UNICODE) == 0)
+  if (FT_Select_Charmap(
+          face, static_cast<FT_Encoding>(fxge::FontEncoding::kUnicode)) == 0) {
     return FT_Get_Char_Index(face, charcode);
+  }
 
   if (m_pFont->GetSubstFont() &&
       m_pFont->GetSubstFont()->m_Charset == FX_Charset::kSymbol) {
     uint32_t index = 0;
-    if (FT_Select_Charmap(face, FT_ENCODING_MS_SYMBOL) == 0)
+    if (FT_Select_Charmap(
+            face, static_cast<FT_Encoding>(fxge::FontEncoding::kSymbol)) == 0) {
       index = FT_Get_Char_Index(face, charcode);
-    if (!index && !FT_Select_Charmap(face, FT_ENCODING_APPLE_ROMAN))
+    }
+    if (!index &&
+        !FT_Select_Charmap(
+            face, static_cast<FT_Encoding>(fxge::FontEncoding::kAppleRoman))) {
       return FT_Get_Char_Index(face, charcode);
+    }
   }
   return charcode;
 }
diff --git a/core/fxge/cfx_unicodeencodingex.cpp b/core/fxge/cfx_unicodeencodingex.cpp
index 683e2d0..c757599 100644
--- a/core/fxge/cfx_unicodeencodingex.cpp
+++ b/core/fxge/cfx_unicodeencodingex.cpp
@@ -11,48 +11,35 @@
 #include "core/fxge/cfx_font.h"
 #include "core/fxge/freetype/fx_freetype.h"
 #include "core/fxge/fx_font.h"
-
-#define ENC_TAG(a, b, c, d)                                               \
-  (((uint32_t)(a) << 24) | ((uint32_t)(b) << 16) | ((uint32_t)(c) << 8) | \
-   (uint32_t)(d))
+#include "core/fxge/fx_fontencoding.h"
 
 namespace {
 
-constexpr uint32_t kEncodingExSymbol = ENC_TAG('s', 'y', 'm', 'b');
-constexpr uint32_t kEncodingExUnicode = ENC_TAG('u', 'n', 'i', 'c');
-constexpr uint32_t kEncodingExSjis = ENC_TAG('s', 'j', 'i', 's');
-constexpr uint32_t kEncodingExGB2312 = ENC_TAG('g', 'b', ' ', ' ');
-constexpr uint32_t kEncodingExBig5 = ENC_TAG('b', 'i', 'g', '5');
-constexpr uint32_t kEncodingExWansung = ENC_TAG('w', 'a', 'n', 's');
-constexpr uint32_t kEncodingExJohab = ENC_TAG('j', 'o', 'h', 'a');
-constexpr uint32_t kEncodingExAdobeStandard = ENC_TAG('A', 'D', 'O', 'B');
-constexpr uint32_t kEncodingExAdobeExpert = ENC_TAG('A', 'D', 'B', 'E');
-constexpr uint32_t kEncodingExAdobeCustom = ENC_TAG('A', 'D', 'B', 'C');
-constexpr uint32_t kEncodingExLatin1 = ENC_TAG('l', 'a', 't', '1');
-constexpr uint32_t kEncodingExOldLatin2 = ENC_TAG('l', 'a', 't', '2');
-constexpr uint32_t kEncodingExAppleRoman = ENC_TAG('a', 'r', 'm', 'n');
-
-constexpr uint32_t kEncodingID[] = {
-    kEncodingExSymbol,      kEncodingExUnicode,       kEncodingExSjis,
-    kEncodingExGB2312,      kEncodingExBig5,          kEncodingExWansung,
-    kEncodingExJohab,       kEncodingExAdobeStandard, kEncodingExAdobeExpert,
-    kEncodingExAdobeCustom, kEncodingExLatin1,        kEncodingExOldLatin2,
-    kEncodingExAppleRoman,
+constexpr fxge::FontEncoding kEncodingIDs[] = {
+    fxge::FontEncoding::kSymbol,      fxge::FontEncoding::kUnicode,
+    fxge::FontEncoding::kSjis,        fxge::FontEncoding::kGB2312,
+    fxge::FontEncoding::kBig5,        fxge::FontEncoding::kWansung,
+    fxge::FontEncoding::kJohab,       fxge::FontEncoding::kAdobeStandard,
+    fxge::FontEncoding::kAdobeExpert, fxge::FontEncoding::kAdobeCustom,
+    fxge::FontEncoding::kLatin1,      fxge::FontEncoding::kOldLatin2,
+    fxge::FontEncoding::kAppleRoman,
 };
 
 std::unique_ptr<CFX_UnicodeEncodingEx> FXFM_CreateFontEncoding(
     CFX_Font* pFont,
-    uint32_t nEncodingID) {
-  if (FXFT_Select_Charmap(pFont->GetFaceRec(), nEncodingID))
+    fxge::FontEncoding encoding_id) {
+  if (FXFT_Select_Charmap(pFont->GetFaceRec(),
+                          static_cast<FT_Encoding>(encoding_id))) {
     return nullptr;
-  return std::make_unique<CFX_UnicodeEncodingEx>(pFont, nEncodingID);
+  }
+  return std::make_unique<CFX_UnicodeEncodingEx>(pFont, encoding_id);
 }
 
 }  // namespace
 
 CFX_UnicodeEncodingEx::CFX_UnicodeEncodingEx(CFX_Font* pFont,
-                                             uint32_t EncodingID)
-    : CFX_UnicodeEncoding(pFont), m_nEncodingID(EncodingID) {}
+                                             fxge::FontEncoding encoding_id)
+    : CFX_UnicodeEncoding(pFont), encoding_id_(encoding_id) {}
 
 CFX_UnicodeEncodingEx::~CFX_UnicodeEncodingEx() = default;
 
@@ -63,31 +50,36 @@
     return nIndex;
   int m = 0;
   while (m < face->num_charmaps) {
-    uint32_t nEncodingID = FXFT_Get_Charmap_Encoding(face->charmaps[m++]);
-    if (m_nEncodingID == nEncodingID)
+    auto encoding_id = static_cast<fxge::FontEncoding>(
+        FXFT_Get_Charmap_Encoding(face->charmaps[m++]));
+    if (encoding_id_ == encoding_id) {
       continue;
-    int error = FXFT_Select_Charmap(face, nEncodingID);
+    }
+    int error =
+        FXFT_Select_Charmap(face, static_cast<FT_Encoding>(encoding_id));
     if (error)
       continue;
     nIndex = FT_Get_Char_Index(face, charcode);
     if (nIndex > 0) {
-      m_nEncodingID = nEncodingID;
+      encoding_id_ = encoding_id;
       return nIndex;
     }
   }
-  FXFT_Select_Charmap(face, m_nEncodingID);
+  FXFT_Select_Charmap(face, static_cast<FT_Encoding>(encoding_id_));
   return 0;
 }
 
 uint32_t CFX_UnicodeEncodingEx::CharCodeFromUnicode(wchar_t Unicode) const {
-  if (m_nEncodingID == kEncodingExUnicode ||
-      m_nEncodingID == kEncodingExSymbol) {
+  if (encoding_id_ == fxge::FontEncoding::kUnicode ||
+      encoding_id_ == fxge::FontEncoding::kSymbol) {
     return Unicode;
   }
   FXFT_FaceRec* face = m_pFont->GetFaceRec();
   for (int i = 0; i < face->num_charmaps; i++) {
-    int nEncodingID = FXFT_Get_Charmap_Encoding(face->charmaps[i]);
-    if (nEncodingID == kEncodingExUnicode || nEncodingID == kEncodingExSymbol) {
+    auto encoding_id = static_cast<fxge::FontEncoding>(
+        FXFT_Get_Charmap_Encoding(face->charmaps[i]));
+    if (encoding_id == fxge::FontEncoding::kUnicode ||
+        encoding_id == fxge::FontEncoding::kSymbol) {
       return Unicode;
     }
   }
@@ -99,7 +91,7 @@
   if (!pFont || !pFont->GetFaceRec())
     return nullptr;
 
-  for (uint32_t id : kEncodingID) {
+  for (fxge::FontEncoding id : kEncodingIDs) {
     auto pFontEncoding = FXFM_CreateFontEncoding(pFont, id);
     if (pFontEncoding)
       return pFontEncoding;
diff --git a/core/fxge/cfx_unicodeencodingex.h b/core/fxge/cfx_unicodeencodingex.h
index da87d7e..306ca68 100644
--- a/core/fxge/cfx_unicodeencodingex.h
+++ b/core/fxge/cfx_unicodeencodingex.h
@@ -11,13 +11,15 @@
 
 #include <memory>
 
+#include "core/fxge/cfx_face.h"
 #include "core/fxge/cfx_unicodeencoding.h"
+#include "core/fxge/fx_fontencoding.h"
 
 class CFX_UnicodeEncodingEx final : public CFX_UnicodeEncoding {
  public:
   static constexpr uint32_t kInvalidCharCode = static_cast<uint32_t>(-1);
 
-  CFX_UnicodeEncodingEx(CFX_Font* pFont, uint32_t EncodingID);
+  CFX_UnicodeEncodingEx(CFX_Font* pFont, fxge::FontEncoding encoding_id);
   ~CFX_UnicodeEncodingEx() override;
 
   // CFX_UnicodeEncoding:
@@ -27,7 +29,7 @@
   uint32_t CharCodeFromUnicode(wchar_t Unicode) const;
 
  private:
-  uint32_t m_nEncodingID;
+  fxge::FontEncoding encoding_id_;
 };
 
 std::unique_ptr<CFX_UnicodeEncodingEx> FX_CreateFontEncodingEx(CFX_Font* pFont);
diff --git a/core/fxge/fx_fontencoding.cpp b/core/fxge/fx_fontencoding.cpp
new file mode 100644
index 0000000..46b3e5b
--- /dev/null
+++ b/core/fxge/fx_fontencoding.cpp
@@ -0,0 +1,47 @@
+// Copyright 2023 The PDFium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "core/fxge/fx_fontencoding.h"
+
+#include "core/fxge/freetype/fx_freetype.h"
+
+namespace fxge {
+
+static_assert(static_cast<uint32_t>(FontEncoding::kAdobeCustom) ==
+                  FT_ENCODING_ADOBE_CUSTOM,
+              "wrong encoding");
+static_assert(static_cast<uint32_t>(FontEncoding::kAdobeExpert) ==
+                  FT_ENCODING_ADOBE_EXPERT,
+              "wrong encoding");
+static_assert(static_cast<uint32_t>(FontEncoding::kAdobeStandard) ==
+                  FT_ENCODING_ADOBE_STANDARD,
+              "wrong encoding");
+static_assert(static_cast<uint32_t>(FontEncoding::kAppleRoman) ==
+                  FT_ENCODING_APPLE_ROMAN,
+              "wrong encoding");
+static_assert(static_cast<uint32_t>(FontEncoding::kBig5) == FT_ENCODING_BIG5,
+              "wrong encoding");
+static_assert(static_cast<uint32_t>(FontEncoding::kGB2312) == FT_ENCODING_PRC,
+              "wrong encoding");
+static_assert(static_cast<uint32_t>(FontEncoding::kJohab) == FT_ENCODING_JOHAB,
+              "wrong encoding");
+static_assert(static_cast<uint32_t>(FontEncoding::kLatin1) ==
+                  FT_ENCODING_ADOBE_LATIN_1,
+              "wrong encoding");
+static_assert(static_cast<uint32_t>(FontEncoding::kOldLatin2) ==
+                  FT_ENCODING_OLD_LATIN_2,
+              "wrong encoding");
+static_assert(static_cast<uint32_t>(FontEncoding::kSjis) == FT_ENCODING_SJIS,
+              "wrong encoding");
+static_assert(static_cast<uint32_t>(FontEncoding::kSymbol) ==
+                  FT_ENCODING_MS_SYMBOL,
+              "wrong encoding");
+static_assert(static_cast<uint32_t>(FontEncoding::kUnicode) ==
+                  FT_ENCODING_UNICODE,
+              "wrong encoding");
+static_assert(static_cast<uint32_t>(FontEncoding::kWansung) ==
+                  FT_ENCODING_WANSUNG,
+              "wrong encoding");
+
+}  // namespace fxge
diff --git a/core/fxge/fx_fontencoding.h b/core/fxge/fx_fontencoding.h
new file mode 100644
index 0000000..d81ae8b
--- /dev/null
+++ b/core/fxge/fx_fontencoding.h
@@ -0,0 +1,33 @@
+// Copyright 2023 The PDFium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CORE_FXGE_FX_FONTENCODING_H_
+#define CORE_FXGE_FX_FONTENCODING_H_
+
+#include <stdint.h>
+
+#include "core/fxcrt/fx_string.h"
+
+namespace fxge {
+
+// The values here match FreeType FT_Encoding values with similar names.
+enum class FontEncoding : uint32_t {
+  kAdobeCustom = FXBSTR_ID('A', 'D', 'B', 'C'),
+  kAdobeExpert = FXBSTR_ID('A', 'D', 'B', 'E'),
+  kAdobeStandard = FXBSTR_ID('A', 'D', 'O', 'B'),
+  kAppleRoman = FXBSTR_ID('a', 'r', 'm', 'n'),
+  kBig5 = FXBSTR_ID('b', 'i', 'g', '5'),
+  kGB2312 = FXBSTR_ID('g', 'b', ' ', ' '),
+  kJohab = FXBSTR_ID('j', 'o', 'h', 'a'),
+  kLatin1 = FXBSTR_ID('l', 'a', 't', '1'),
+  kOldLatin2 = FXBSTR_ID('l', 'a', 't', '2'),
+  kSjis = FXBSTR_ID('s', 'j', 'i', 's'),
+  kSymbol = FXBSTR_ID('s', 'y', 'm', 'b'),
+  kUnicode = FXBSTR_ID('u', 'n', 'i', 'c'),
+  kWansung = FXBSTR_ID('w', 'a', 'n', 's'),
+};
+
+}  // namespace fxge
+
+#endif  // CORE_FXGE_FX_FONTENCODING_H_
diff --git a/xfa/fgas/font/cfgas_fontmgr.cpp b/xfa/fgas/font/cfgas_fontmgr.cpp
index 0d36325..ebaf4de 100644
--- a/xfa/fgas/font/cfgas_fontmgr.cpp
+++ b/xfa/fgas/font/cfgas_fontmgr.cpp
@@ -26,6 +26,7 @@
 #include "core/fxge/cfx_fontmgr.h"
 #include "core/fxge/cfx_gemodule.h"
 #include "core/fxge/fx_font.h"
+#include "core/fxge/fx_fontencoding.h"
 #include "third_party/base/check.h"
 #include "third_party/base/containers/contains.h"
 #include "third_party/base/containers/span.h"
@@ -42,8 +43,10 @@
 
   FXFT_FaceRec* pFaceRec = pFace->GetRec();
   FT_CharMap charmap = pFaceRec->charmap;
-  if (FXFT_Select_Charmap(pFaceRec, FT_ENCODING_UNICODE) != 0)
+  if (FXFT_Select_Charmap(pFaceRec, static_cast<FT_Encoding>(
+                                        fxge::FontEncoding::kUnicode)) != 0) {
     return false;
+  }
 
   if (FT_Get_Char_Index(pFaceRec, wcUnicode) == 0) {
     FT_Set_Charmap(pFaceRec, charmap);
@@ -548,8 +551,8 @@
   if (!pFace)
     return false;
 
-  FT_Error retCharmap =
-      FXFT_Select_Charmap(pFace->GetRec(), FT_ENCODING_UNICODE);
+  FT_Error retCharmap = FXFT_Select_Charmap(
+      pFace->GetRec(), static_cast<FT_Encoding>(fxge::FontEncoding::kUnicode));
   FT_Error retIndex = FT_Get_Char_Index(pFace->GetRec(), wcUnicode);
 
   pFace->ClearExternalStream();