Make fxge::FontEncoding independent from FT_Encoding

Instead of having FontEncoding values that just happen to match
FT_Encoding values, change the FontEncoding to a simple enum. Then add
conversion functions between the two data types, and use them in place
of static_casts.

Bug: pdfium:2037
Change-Id: Idee1cb09d9f8a63f50abb4e3cfdd1abce391e1fe
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/114830
Reviewed-by: Dominik Röttsches <drott@chromium.org>
Commit-Queue: Lei Zhang <thestig@chromium.org>
diff --git a/core/fxge/BUILD.gn b/core/fxge/BUILD.gn
index b7b1b0d..7034cd1 100644
--- a/core/fxge/BUILD.gn
+++ b/core/fxge/BUILD.gn
@@ -98,7 +98,6 @@
     "freetype/fx_freetype.h",
     "fx_font.cpp",
     "fx_font.h",
-    "fx_fontencoding.cpp",
     "fx_fontencoding.h",
     "render_defines.h",
     "renderdevicedriver_iface.cpp",
diff --git a/core/fxge/cfx_face.cpp b/core/fxge/cfx_face.cpp
index 9bca779..8e6f423 100644
--- a/core/fxge/cfx_face.cpp
+++ b/core/fxge/cfx_face.cpp
@@ -22,6 +22,7 @@
 #include "core/fxge/scoped_font_transform.h"
 #include "third_party/base/check.h"
 #include "third_party/base/check_op.h"
+#include "third_party/base/notreached.h"
 #include "third_party/base/numerics/safe_conversions.h"
 #include "third_party/base/numerics/safe_math.h"
 
@@ -201,6 +202,69 @@
   return 0;
 }
 
+FT_Encoding ToFTEncoding(fxge::FontEncoding encoding) {
+  switch (encoding) {
+    case fxge::FontEncoding::kAdobeCustom:
+      return FT_ENCODING_ADOBE_CUSTOM;
+    case fxge::FontEncoding::kAdobeExpert:
+      return FT_ENCODING_ADOBE_EXPERT;
+    case fxge::FontEncoding::kAdobeStandard:
+      return FT_ENCODING_ADOBE_STANDARD;
+    case fxge::FontEncoding::kAppleRoman:
+      return FT_ENCODING_APPLE_ROMAN;
+    case fxge::FontEncoding::kBig5:
+      return FT_ENCODING_BIG5;
+    case fxge::FontEncoding::kGB2312:
+      return FT_ENCODING_PRC;
+    case fxge::FontEncoding::kJohab:
+      return FT_ENCODING_JOHAB;
+    case fxge::FontEncoding::kLatin1:
+      return FT_ENCODING_ADOBE_LATIN_1;
+    case fxge::FontEncoding::kOldLatin2:
+      return FT_ENCODING_OLD_LATIN_2;
+    case fxge::FontEncoding::kSjis:
+      return FT_ENCODING_SJIS;
+    case fxge::FontEncoding::kSymbol:
+      return FT_ENCODING_MS_SYMBOL;
+    case fxge::FontEncoding::kUnicode:
+      return FT_ENCODING_UNICODE;
+    case fxge::FontEncoding::kWansung:
+      return FT_ENCODING_WANSUNG;
+  }
+}
+
+fxge::FontEncoding ToFontEncoding(uint32_t ft_encoding) {
+  switch (ft_encoding) {
+    case FT_ENCODING_ADOBE_CUSTOM:
+      return fxge::FontEncoding::kAdobeCustom;
+    case FT_ENCODING_ADOBE_EXPERT:
+      return fxge::FontEncoding::kAdobeExpert;
+    case FT_ENCODING_ADOBE_STANDARD:
+      return fxge::FontEncoding::kAdobeStandard;
+    case FT_ENCODING_APPLE_ROMAN:
+      return fxge::FontEncoding::kAppleRoman;
+    case FT_ENCODING_BIG5:
+      return fxge::FontEncoding::kBig5;
+    case FT_ENCODING_PRC:
+      return fxge::FontEncoding::kGB2312;
+    case FT_ENCODING_JOHAB:
+      return fxge::FontEncoding::kJohab;
+    case FT_ENCODING_ADOBE_LATIN_1:
+      return fxge::FontEncoding::kLatin1;
+    case FT_ENCODING_OLD_LATIN_2:
+      return fxge::FontEncoding::kOldLatin2;
+    case FT_ENCODING_SJIS:
+      return fxge::FontEncoding::kSjis;
+    case FT_ENCODING_MS_SYMBOL:
+      return fxge::FontEncoding::kSymbol;
+    case FT_ENCODING_UNICODE:
+      return fxge::FontEncoding::kUnicode;
+    case FT_ENCODING_WANSUNG:
+      return fxge::FontEncoding::kWansung;
+  }
+  NOTREACHED_NORETURN();
+}
+
 }  // namespace
 
 // static
@@ -608,7 +672,7 @@
   if (!GetRec()->charmap) {
     return absl::nullopt;
   }
-  return static_cast<fxge::FontEncoding>(GetRec()->charmap->encoding);
+  return ToFontEncoding(GetRec()->charmap->encoding);
 }
 
 int CFX_Face::GetCharMapPlatformIdByIndex(size_t index) const {
@@ -623,7 +687,7 @@
 
 fxge::FontEncoding CFX_Face::GetCharMapEncodingByIndex(size_t index) const {
   CHECK_LT(index, GetCharMapCount());
-  return static_cast<fxge::FontEncoding>(GetRec()->charmaps[index]->encoding);
+  return ToFontEncoding(GetRec()->charmaps[index]->encoding);
 }
 
 size_t CFX_Face::GetCharMapCount() const {
@@ -642,8 +706,7 @@
 }
 
 bool CFX_Face::SelectCharMap(fxge::FontEncoding encoding) {
-  FT_Error error =
-      FT_Select_Charmap(GetRec(), static_cast<FT_Encoding>(encoding));
+  FT_Error error = FT_Select_Charmap(GetRec(), ToFTEncoding(encoding));
   return !error;
 }
 
diff --git a/core/fxge/fx_fontencoding.cpp b/core/fxge/fx_fontencoding.cpp
deleted file mode 100644
index 46b3e5b..0000000
--- a/core/fxge/fx_fontencoding.cpp
+++ /dev/null
@@ -1,47 +0,0 @@
-// 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
index d81ae8b..a1de368 100644
--- a/core/fxge/fx_fontencoding.h
+++ b/core/fxge/fx_fontencoding.h
@@ -7,25 +7,22 @@
 
 #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'),
+  kAdobeCustom,
+  kAdobeExpert,
+  kAdobeStandard,
+  kAppleRoman,
+  kBig5,
+  kGB2312,
+  kJohab,
+  kLatin1,
+  kOldLatin2,
+  kSjis,
+  kSymbol,
+  kUnicode,
+  kWansung,
 };
 
 }  // namespace fxge