Make CIDCoding an enum class.

-- Then fix some places where it was passed as an int
-- Handle all values in switch statements.

Change-Id: Idb2eea3314a26c08c8ea802a75ae5ef42e2ca812
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/84195
Commit-Queue: Lei Zhang <thestig@chromium.org>
Reviewed-by: Lei Zhang <thestig@chromium.org>
diff --git a/core/fpdfapi/font/cpdf_cidfont.cpp b/core/fpdfapi/font/cpdf_cidfont.cpp
index 754db74..2fe9af9 100644
--- a/core/fpdfapi/font/cpdf_cidfont.cpp
+++ b/core/fpdfapi/font/cpdf_cidfont.cpp
@@ -189,19 +189,19 @@
 
 #endif  // !defined(OS_WIN)
 
-void FT_UseCIDCharmap(FXFT_FaceRec* face, int coding) {
+void FT_UseCIDCharmap(FXFT_FaceRec* face, CIDCoding coding) {
   int encoding;
   switch (coding) {
-    case CIDCODING_GB:
+    case CIDCoding::kGB:
       encoding = FT_ENCODING_GB2312;
       break;
-    case CIDCODING_BIG5:
+    case CIDCoding::kBIG5:
       encoding = FT_ENCODING_BIG5;
       break;
-    case CIDCODING_JIS:
+    case CIDCoding::kJIS:
       encoding = FT_ENCODING_SJIS;
       break;
-    case CIDCODING_KOREA:
+    case CIDCoding::kKOREA:
       encoding = FT_ENCODING_JOHAB;
       break;
     default:
@@ -311,13 +311,15 @@
 
 wchar_t CPDF_CIDFont::GetUnicodeFromCharCode(uint32_t charcode) const {
   switch (m_pCMap->GetCoding()) {
-    case CIDCODING_UCS2:
-    case CIDCODING_UTF16:
+    case CIDCoding::kUCS2:
+    case CIDCoding::kUTF16:
       return static_cast<wchar_t>(charcode);
-    case CIDCODING_CID:
+    case CIDCoding::kCID:
       if (!m_pCID2UnicodeMap || !m_pCID2UnicodeMap->IsLoaded())
         return 0;
       return m_pCID2UnicodeMap->UnicodeFromCID(static_cast<uint16_t>(charcode));
+    default:
+      break;
   }
   if (m_pCID2UnicodeMap && m_pCID2UnicodeMap->IsLoaded() && m_pCMap->IsLoaded())
     return m_pCID2UnicodeMap->UnicodeFromCID(CIDFromCharCode(charcode));
@@ -330,7 +332,7 @@
     charsize = 2;
   }
   size_t ret = FX_MultiByteToWideChar(
-      kCharsetCodePages[m_pCMap->GetCoding()],
+      kCharsetCodePages[static_cast<size_t>(m_pCMap->GetCoding())],
       ByteStringView(reinterpret_cast<const char*>(&charcode), charsize),
       pdfium::make_span(&unicode, 1));
   return ret == 1 ? unicode : 0;
@@ -346,13 +348,14 @@
   uint32_t charcode = CPDF_Font::CharCodeFromUnicode(unicode);
   if (charcode)
     return charcode;
+
   switch (m_pCMap->GetCoding()) {
-    case CIDCODING_UNKNOWN:
+    case CIDCoding::kUNKNOWN:
       return 0;
-    case CIDCODING_UCS2:
-    case CIDCODING_UTF16:
+    case CIDCoding::kUCS2:
+    case CIDCoding::kUTF16:
       return unicode;
-    case CIDCODING_CID: {
+    case CIDCoding::kCID: {
       if (!m_pCID2UnicodeMap || !m_pCID2UnicodeMap->IsLoaded())
         return 0;
       uint32_t cid = 0;
@@ -365,16 +368,19 @@
       }
       break;
     }
+    default:
+      break;
   }
 
   if (unicode < 0x80)
     return static_cast<uint32_t>(unicode);
-  if (m_pCMap->GetCoding() == CIDCODING_CID)
+  if (m_pCMap->GetCoding() == CIDCoding::kCID)
     return 0;
 #if defined(OS_WIN)
   uint8_t buffer[32];
   size_t ret = FX_WideCharToMultiByte(
-      kCharsetCodePages[m_pCMap->GetCoding()], WideStringView(&unicode, 1),
+      kCharsetCodePages[static_cast<size_t>(m_pCMap->GetCoding())],
+      WideStringView(&unicode, 1),
       pdfium::make_span(reinterpret_cast<char*>(buffer), 4));
   if (ret == 1)
     return buffer[0];
@@ -775,7 +781,7 @@
       return cid;
     if (m_pFontFile && m_pCMap->IsDirectCharcodeToCIDTableIsEmpty())
       return cid;
-    if (m_pCMap->GetCoding() == CIDCODING_UNKNOWN ||
+    if (m_pCMap->GetCoding() == CIDCoding::kUNKNOWN ||
         !FXFT_Get_Face_Charmap(m_Font.GetFaceRec())) {
       return cid;
     }
@@ -817,7 +823,7 @@
 bool CPDF_CIDFont::IsUnicodeCompatible() const {
   if (m_pCID2UnicodeMap && m_pCID2UnicodeMap->IsLoaded() && m_pCMap->IsLoaded())
     return true;
-  return m_pCMap->GetCoding() != CIDCODING_UNKNOWN;
+  return m_pCMap->GetCoding() != CIDCoding::kUNKNOWN;
 }
 
 void CPDF_CIDFont::LoadSubstFont() {
diff --git a/core/fpdfapi/font/cpdf_cmap.cpp b/core/fpdfapi/font/cpdf_cmap.cpp
index ea92946..2b4e3ec 100644
--- a/core/fpdfapi/font/cpdf_cmap.cpp
+++ b/core/fpdfapi/font/cpdf_cmap.cpp
@@ -35,151 +35,176 @@
 constexpr PredefinedCMap kPredefinedCMaps[] = {
     {"GB-EUC",
      CIDSET_GB1,
-     CIDCODING_GB,
+     CIDCoding::kGB,
      CPDF_CMap::MixedTwoBytes,
      1,
      {{0xa1, 0xfe}}},
     {"GBpc-EUC",
      CIDSET_GB1,
-     CIDCODING_GB,
+     CIDCoding::kGB,
      CPDF_CMap::MixedTwoBytes,
      1,
      {{0xa1, 0xfc}}},
     {"GBK-EUC",
      CIDSET_GB1,
-     CIDCODING_GB,
+     CIDCoding::kGB,
      CPDF_CMap::MixedTwoBytes,
      1,
      {{0x81, 0xfe}}},
     {"GBKp-EUC",
      CIDSET_GB1,
-     CIDCODING_GB,
+     CIDCoding::kGB,
      CPDF_CMap::MixedTwoBytes,
      1,
      {{0x81, 0xfe}}},
     {"GBK2K-EUC",
      CIDSET_GB1,
-     CIDCODING_GB,
+     CIDCoding::kGB,
      CPDF_CMap::MixedTwoBytes,
      1,
      {{0x81, 0xfe}}},
     {"GBK2K",
      CIDSET_GB1,
-     CIDCODING_GB,
+     CIDCoding::kGB,
      CPDF_CMap::MixedTwoBytes,
      1,
      {{0x81, 0xfe}}},
-    {"UniGB-UCS2", CIDSET_GB1, CIDCODING_UCS2, CPDF_CMap::TwoBytes, 0, {}},
-    {"UniGB-UTF16", CIDSET_GB1, CIDCODING_UTF16, CPDF_CMap::TwoBytes, 0, {}},
+    {"UniGB-UCS2", CIDSET_GB1, CIDCoding::kUCS2, CPDF_CMap::TwoBytes, 0, {}},
+    {"UniGB-UTF16", CIDSET_GB1, CIDCoding::kUTF16, CPDF_CMap::TwoBytes, 0, {}},
     {"B5pc",
      CIDSET_CNS1,
-     CIDCODING_BIG5,
+     CIDCoding::kBIG5,
      CPDF_CMap::MixedTwoBytes,
      1,
      {{0xa1, 0xfc}}},
     {"HKscs-B5",
      CIDSET_CNS1,
-     CIDCODING_BIG5,
+     CIDCoding::kBIG5,
      CPDF_CMap::MixedTwoBytes,
      1,
      {{0x88, 0xfe}}},
     {"ETen-B5",
      CIDSET_CNS1,
-     CIDCODING_BIG5,
+     CIDCoding::kBIG5,
      CPDF_CMap::MixedTwoBytes,
      1,
      {{0xa1, 0xfe}}},
     {"ETenms-B5",
      CIDSET_CNS1,
-     CIDCODING_BIG5,
+     CIDCoding::kBIG5,
      CPDF_CMap::MixedTwoBytes,
      1,
      {{0xa1, 0xfe}}},
-    {"UniCNS-UCS2", CIDSET_CNS1, CIDCODING_UCS2, CPDF_CMap::TwoBytes, 0, {}},
-    {"UniCNS-UTF16", CIDSET_CNS1, CIDCODING_UTF16, CPDF_CMap::TwoBytes, 0, {}},
+    {"UniCNS-UCS2", CIDSET_CNS1, CIDCoding::kUCS2, CPDF_CMap::TwoBytes, 0, {}},
+    {"UniCNS-UTF16",
+     CIDSET_CNS1,
+     CIDCoding::kUTF16,
+     CPDF_CMap::TwoBytes,
+     0,
+     {}},
     {"83pv-RKSJ",
      CIDSET_JAPAN1,
-     CIDCODING_JIS,
+     CIDCoding::kJIS,
      CPDF_CMap::MixedTwoBytes,
      2,
      {{0x81, 0x9f}, {0xe0, 0xfc}}},
     {"90ms-RKSJ",
      CIDSET_JAPAN1,
-     CIDCODING_JIS,
+     CIDCoding::kJIS,
      CPDF_CMap::MixedTwoBytes,
      2,
      {{0x81, 0x9f}, {0xe0, 0xfc}}},
     {"90msp-RKSJ",
      CIDSET_JAPAN1,
-     CIDCODING_JIS,
+     CIDCoding::kJIS,
      CPDF_CMap::MixedTwoBytes,
      2,
      {{0x81, 0x9f}, {0xe0, 0xfc}}},
     {"90pv-RKSJ",
      CIDSET_JAPAN1,
-     CIDCODING_JIS,
+     CIDCoding::kJIS,
      CPDF_CMap::MixedTwoBytes,
      2,
      {{0x81, 0x9f}, {0xe0, 0xfc}}},
     {"Add-RKSJ",
      CIDSET_JAPAN1,
-     CIDCODING_JIS,
+     CIDCoding::kJIS,
      CPDF_CMap::MixedTwoBytes,
      2,
      {{0x81, 0x9f}, {0xe0, 0xfc}}},
     {"EUC",
      CIDSET_JAPAN1,
-     CIDCODING_JIS,
+     CIDCoding::kJIS,
      CPDF_CMap::MixedTwoBytes,
      2,
      {{0x8e, 0x8e}, {0xa1, 0xfe}}},
-    {"H", CIDSET_JAPAN1, CIDCODING_JIS, CPDF_CMap::TwoBytes, 1, {{0x21, 0x7e}}},
-    {"V", CIDSET_JAPAN1, CIDCODING_JIS, CPDF_CMap::TwoBytes, 1, {{0x21, 0x7e}}},
+    {"H",
+     CIDSET_JAPAN1,
+     CIDCoding::kJIS,
+     CPDF_CMap::TwoBytes,
+     1,
+     {{0x21, 0x7e}}},
+    {"V",
+     CIDSET_JAPAN1,
+     CIDCoding::kJIS,
+     CPDF_CMap::TwoBytes,
+     1,
+     {{0x21, 0x7e}}},
     {"Ext-RKSJ",
      CIDSET_JAPAN1,
-     CIDCODING_JIS,
+     CIDCoding::kJIS,
      CPDF_CMap::MixedTwoBytes,
      2,
      {{0x81, 0x9f}, {0xe0, 0xfc}}},
-    {"UniJIS-UCS2", CIDSET_JAPAN1, CIDCODING_UCS2, CPDF_CMap::TwoBytes, 0, {}},
+    {"UniJIS-UCS2",
+     CIDSET_JAPAN1,
+     CIDCoding::kUCS2,
+     CPDF_CMap::TwoBytes,
+     0,
+     {}},
     {"UniJIS-UCS2-HW",
      CIDSET_JAPAN1,
-     CIDCODING_UCS2,
+     CIDCoding::kUCS2,
      CPDF_CMap::TwoBytes,
      0,
      {}},
     {"UniJIS-UTF16",
      CIDSET_JAPAN1,
-     CIDCODING_UTF16,
+     CIDCoding::kUTF16,
      CPDF_CMap::TwoBytes,
      0,
      {}},
     {"KSC-EUC",
      CIDSET_KOREA1,
-     CIDCODING_KOREA,
+     CIDCoding::kKOREA,
      CPDF_CMap::MixedTwoBytes,
      1,
      {{0xa1, 0xfe}}},
     {"KSCms-UHC",
      CIDSET_KOREA1,
-     CIDCODING_KOREA,
+     CIDCoding::kKOREA,
      CPDF_CMap::MixedTwoBytes,
      1,
      {{0x81, 0xfe}}},
     {"KSCms-UHC-HW",
      CIDSET_KOREA1,
-     CIDCODING_KOREA,
+     CIDCoding::kKOREA,
      CPDF_CMap::MixedTwoBytes,
      1,
      {{0x81, 0xfe}}},
     {"KSCpc-EUC",
      CIDSET_KOREA1,
-     CIDCODING_KOREA,
+     CIDCoding::kKOREA,
      CPDF_CMap::MixedTwoBytes,
      1,
      {{0xa1, 0xfd}}},
-    {"UniKS-UCS2", CIDSET_KOREA1, CIDCODING_UCS2, CPDF_CMap::TwoBytes, 0, {}},
-    {"UniKS-UTF16", CIDSET_KOREA1, CIDCODING_UTF16, CPDF_CMap::TwoBytes, 0, {}},
+    {"UniKS-UCS2", CIDSET_KOREA1, CIDCoding::kUCS2, CPDF_CMap::TwoBytes, 0, {}},
+    {"UniKS-UTF16",
+     CIDSET_KOREA1,
+     CIDCoding::kUTF16,
+     CPDF_CMap::TwoBytes,
+     0,
+     {}},
 };
 
 const PredefinedCMap* GetPredefinedCMap(ByteStringView cmapid) {
@@ -270,7 +295,7 @@
 CPDF_CMap::CPDF_CMap(ByteStringView bsPredefinedName)
     : m_bVertical(bsPredefinedName.Back() == 'V') {
   if (bsPredefinedName == "Identity-H" || bsPredefinedName == "Identity-V") {
-    m_Coding = CIDCODING_CID;
+    m_Coding = CIDCoding::kCID;
     m_bLoaded = true;
     return;
   }
@@ -309,7 +334,7 @@
 CPDF_CMap::~CPDF_CMap() = default;
 
 uint16_t CPDF_CMap::CIDFromCharCode(uint32_t charcode) const {
-  if (m_Coding == CIDCODING_CID)
+  if (m_Coding == CIDCoding::kCID)
     return static_cast<uint16_t>(charcode);
 
   if (m_pEmbedMap)
diff --git a/core/fpdfapi/font/cpdf_cmap.h b/core/fpdfapi/font/cpdf_cmap.h
index 3d84915..821df5d 100644
--- a/core/fpdfapi/font/cpdf_cmap.h
+++ b/core/fpdfapi/font/cpdf_cmap.h
@@ -17,15 +17,15 @@
 
 struct FXCMAP_CMap;
 
-enum CIDCoding : uint8_t {
-  CIDCODING_UNKNOWN = 0,
-  CIDCODING_GB,
-  CIDCODING_BIG5,
-  CIDCODING_JIS,
-  CIDCODING_KOREA,
-  CIDCODING_UCS2,
-  CIDCODING_CID,
-  CIDCODING_UTF16,
+enum class CIDCoding : uint8_t {
+  kUNKNOWN = 0,
+  kGB,
+  kBIG5,
+  kJIS,
+  kKOREA,
+  kUCS2,
+  kCID,
+  kUTF16,
 };
 
 class CPDF_CMap final : public Retainable {
@@ -66,7 +66,7 @@
   void SetAdditionalMappings(std::vector<CIDRange> mappings);
   void SetMixedFourByteLeadingRanges(std::vector<CodeRange> ranges);
 
-  int GetCoding() const { return m_Coding; }
+  CIDCoding GetCoding() const { return m_Coding; }
   const FXCMAP_CMap* GetEmbedMap() const { return m_pEmbedMap.Get(); }
   CIDSet GetCharset() const { return m_Charset; }
   void SetCharset(CIDSet set) { m_Charset = set; }
@@ -87,7 +87,7 @@
   bool m_bVertical = false;
   CIDSet m_Charset = CIDSET_UNKNOWN;
   CodingScheme m_CodingScheme = TwoBytes;
-  int m_Coding = CIDCODING_UNKNOWN;
+  CIDCoding m_Coding = CIDCoding::kUNKNOWN;
   std::vector<bool> m_MixedTwoByteLeadingBytes;
   std::vector<CodeRange> m_MixedFourByteLeadingRanges;
   std::vector<uint16_t, FxAllocAllocator<uint16_t>> m_DirectCharcodeToCIDTable;