Make FX_BIDICLASS an enum class.

Precursor to moving this class to fx_unicode.h to fix the some
of the typing issues. Many of the casts can be resolved once this
moves (since we can then use the enum inside FX_CHAR as well).

Change-Id: Iccc2b69f97c8d6a45376150f51dd6daf81209068
Reviewed-on: https://pdfium-review.googlesource.com/c/48090
Reviewed-by: Lei Zhang <thestig@chromium.org>
Commit-Queue: Tom Sepez <tsepez@chromium.org>
diff --git a/core/fxcrt/fx_bidi.cpp b/core/fxcrt/fx_bidi.cpp
index 7bd34a3..bc31a32 100644
--- a/core/fxcrt/fx_bidi.cpp
+++ b/core/fxcrt/fx_bidi.cpp
@@ -17,27 +17,27 @@
 
 namespace {
 
-enum FX_BIDICLASS {
-  FX_BIDICLASS_ON = 0,    // Other Neutral
-  FX_BIDICLASS_L = 1,     // Left Letter
-  FX_BIDICLASS_R = 2,     // Right Letter
-  FX_BIDICLASS_AN = 3,    // Arabic Number
-  FX_BIDICLASS_EN = 4,    // European Number
-  FX_BIDICLASS_AL = 5,    // Arabic Letter
-  FX_BIDICLASS_NSM = 6,   // Non-spacing Mark
-  FX_BIDICLASS_CS = 7,    // Common Number Separator
-  FX_BIDICLASS_ES = 8,    // European Separator
-  FX_BIDICLASS_ET = 9,    // European Number Terminator
-  FX_BIDICLASS_BN = 10,   // Boundary Neutral
-  FX_BIDICLASS_S = 11,    // Segment Separator
-  FX_BIDICLASS_WS = 12,   // Whitespace
-  FX_BIDICLASS_B = 13,    // Paragraph Separator
-  FX_BIDICLASS_RLO = 14,  // Right-to-Left Override
-  FX_BIDICLASS_RLE = 15,  // Right-to-Left Embedding
-  FX_BIDICLASS_LRO = 16,  // Left-to-Right Override
-  FX_BIDICLASS_LRE = 17,  // Left-to-Right Embedding
-  FX_BIDICLASS_PDF = 18,  // Pop Directional Format
-  FX_BIDICLASS_N = FX_BIDICLASS_ON,
+enum class FX_BIDICLASS : uint8_t {
+  kON = 0,    // Other Neutral
+  kL = 1,     // Left Letter
+  kR = 2,     // Right Letter
+  kAN = 3,    // Arabic Number
+  kEN = 4,    // European Number
+  kAL = 5,    // Arabic Letter
+  kNSM = 6,   // Non-spacing Mark
+  kCS = 7,    // Common Number Separator
+  kES = 8,    // European Separator
+  kET = 9,    // European Number Terminator
+  kBN = 10,   // Boundary Neutral
+  kS = 11,    // Segment Separator
+  kWS = 12,   // Whitespace
+  kB = 13,    // Paragraph Separator
+  kRLO = 14,  // Right-to-Left Override
+  kRLE = 15,  // Right-to-Left Embedding
+  kLRO = 16,  // Left-to-Right Override
+  kLRE = 17,  // Left-to-Right Embedding
+  kPDF = 18,  // Pop Directional Format
+  kN = kON,
 };
 constexpr uint32_t FX_BIDICLASSBITS = 6;
 constexpr uint32_t FX_BIDICLASSBITSMASK = 0x1F << FX_BIDICLASSBITS;
@@ -71,29 +71,33 @@
   FX_BWSlet
 };
 
+#undef PACK_NIBBLES
+#define PACK_NIBBLES(hi, lo) \
+  ((static_cast<uint32_t>(hi) << 4) + static_cast<uint32_t>(lo))
+
 enum FX_BIDIWEAKACTION {
   FX_BWAIX = 0x100,
   FX_BWAXX = 0x0F,
-  FX_BWAxxx = (0x0F << 4) + 0x0F,
+  FX_BWAxxx = 0xFF,
   FX_BWAxIx = 0x100 + FX_BWAxxx,
-  FX_BWAxxN = (0x0F << 4) + FX_BIDICLASS_ON,
-  FX_BWAxxE = (0x0F << 4) + FX_BIDICLASS_EN,
-  FX_BWAxxA = (0x0F << 4) + FX_BIDICLASS_AN,
-  FX_BWAxxR = (0x0F << 4) + FX_BIDICLASS_R,
-  FX_BWAxxL = (0x0F << 4) + FX_BIDICLASS_L,
-  FX_BWANxx = (FX_BIDICLASS_ON << 4) + 0x0F,
-  FX_BWAAxx = (FX_BIDICLASS_AN << 4) + 0x0F,
-  FX_BWAExE = (FX_BIDICLASS_EN << 4) + FX_BIDICLASS_EN,
-  FX_BWANIx = (FX_BIDICLASS_ON << 4) + 0x0F + 0x100,
-  FX_BWANxN = (FX_BIDICLASS_ON << 4) + FX_BIDICLASS_ON,
-  FX_BWANxR = (FX_BIDICLASS_ON << 4) + FX_BIDICLASS_R,
-  FX_BWANxE = (FX_BIDICLASS_ON << 4) + FX_BIDICLASS_EN,
-  FX_BWAAxA = (FX_BIDICLASS_AN << 4) + FX_BIDICLASS_AN,
-  FX_BWANxL = (FX_BIDICLASS_ON << 4) + FX_BIDICLASS_L,
-  FX_BWALxL = (FX_BIDICLASS_L << 4) + FX_BIDICLASS_L,
-  FX_BWAxIL = (0x0F << 4) + FX_BIDICLASS_L + 0x100,
-  FX_BWAAxR = (FX_BIDICLASS_AN << 4) + FX_BIDICLASS_R,
-  FX_BWALxx = (FX_BIDICLASS_L << 4) + 0x0F,
+  FX_BWAxxN = PACK_NIBBLES(0x0F, FX_BIDICLASS::kON),
+  FX_BWAxxE = PACK_NIBBLES(0x0F, FX_BIDICLASS::kEN),
+  FX_BWAxxA = PACK_NIBBLES(0x0F, FX_BIDICLASS::kAN),
+  FX_BWAxxR = PACK_NIBBLES(0x0F, FX_BIDICLASS::kR),
+  FX_BWAxxL = PACK_NIBBLES(0x0F, FX_BIDICLASS::kL),
+  FX_BWANxx = PACK_NIBBLES(FX_BIDICLASS::kON, 0x0F),
+  FX_BWAAxx = PACK_NIBBLES(FX_BIDICLASS::kAN, 0x0F),
+  FX_BWAExE = PACK_NIBBLES(FX_BIDICLASS::kEN, FX_BIDICLASS::kEN),
+  FX_BWANIx = 0x100 + PACK_NIBBLES(FX_BIDICLASS::kON, 0x0F),
+  FX_BWANxN = PACK_NIBBLES(FX_BIDICLASS::kON, FX_BIDICLASS::kON),
+  FX_BWANxR = PACK_NIBBLES(FX_BIDICLASS::kON, FX_BIDICLASS::kR),
+  FX_BWANxE = PACK_NIBBLES(FX_BIDICLASS::kON, FX_BIDICLASS::kEN),
+  FX_BWAAxA = PACK_NIBBLES(FX_BIDICLASS::kAN, FX_BIDICLASS::kAN),
+  FX_BWANxL = PACK_NIBBLES(FX_BIDICLASS::kON, FX_BIDICLASS::kL),
+  FX_BWALxL = PACK_NIBBLES(FX_BIDICLASS::kL, FX_BIDICLASS::kL),
+  FX_BWAxIL = 0x100 + PACK_NIBBLES(0x0F, FX_BIDICLASS::kL),
+  FX_BWAAxR = PACK_NIBBLES(FX_BIDICLASS::kAN, FX_BIDICLASS::kR),
+  FX_BWALxx = PACK_NIBBLES(FX_BIDICLASS::kL, 0x0F),
 };
 
 enum FX_BIDINEUTRALSTATE {
@@ -106,20 +110,23 @@
 };
 
 enum FX_BIDINEUTRALACTION {
-  FX_BNAnL = FX_BIDICLASS_L,
-  FX_BNAEn = (FX_BIDICLASS_AN << 4),
-  FX_BNARn = (FX_BIDICLASS_R << 4),
-  FX_BNALn = (FX_BIDICLASS_L << 4),
+  FX_BNAnL = PACK_NIBBLES(0, FX_BIDICLASS::kL),
+  FX_BNAEn = PACK_NIBBLES(FX_BIDICLASS::kAN, 0),
+  FX_BNARn = PACK_NIBBLES(FX_BIDICLASS::kR, 0),
+  FX_BNALn = PACK_NIBBLES(FX_BIDICLASS::kL, 0),
   FX_BNAIn = FX_BWAIX,
-  FX_BNALnL = (FX_BIDICLASS_L << 4) + FX_BIDICLASS_L,
+  FX_BNALnL = PACK_NIBBLES(FX_BIDICLASS::kL, FX_BIDICLASS::kL),
 };
+#undef PACK_NIBBLES
 
-const int32_t gc_FX_BidiNTypes[] = {
-    FX_BIDICLASS_N,   FX_BIDICLASS_L,   FX_BIDICLASS_R,   FX_BIDICLASS_AN,
-    FX_BIDICLASS_EN,  FX_BIDICLASS_AL,  FX_BIDICLASS_NSM, FX_BIDICLASS_CS,
-    FX_BIDICLASS_ES,  FX_BIDICLASS_ET,  FX_BIDICLASS_BN,  FX_BIDICLASS_BN,
-    FX_BIDICLASS_N,   FX_BIDICLASS_B,   FX_BIDICLASS_RLO, FX_BIDICLASS_RLE,
-    FX_BIDICLASS_LRO, FX_BIDICLASS_LRE, FX_BIDICLASS_PDF, FX_BIDICLASS_ON,
+const FX_BIDICLASS gc_FX_BidiNTypes[] = {
+    FX_BIDICLASS::kN,   FX_BIDICLASS::kL,   FX_BIDICLASS::kR,
+    FX_BIDICLASS::kAN,  FX_BIDICLASS::kEN,  FX_BIDICLASS::kAL,
+    FX_BIDICLASS::kNSM, FX_BIDICLASS::kCS,  FX_BIDICLASS::kES,
+    FX_BIDICLASS::kET,  FX_BIDICLASS::kBN,  FX_BIDICLASS::kBN,
+    FX_BIDICLASS::kN,   FX_BIDICLASS::kB,   FX_BIDICLASS::kRLO,
+    FX_BIDICLASS::kRLE, FX_BIDICLASS::kLRO, FX_BIDICLASS::kLRE,
+    FX_BIDICLASS::kPDF, FX_BIDICLASS::kON,
 };
 
 const int32_t gc_FX_BidiWeakStates[][10] = {
@@ -218,10 +225,10 @@
 };
 const int32_t gc_FX_BidiNeutralActions[][5] = {
     {FX_BNAIn, 0, 0, 0, 0},
-    {FX_BNAIn, 0, 0, 0, FX_BIDICLASS_L},
+    {FX_BNAIn, 0, 0, 0, static_cast<uint32_t>(FX_BIDICLASS::kL)},
     {FX_BNAIn, FX_BNAEn, FX_BNARn, FX_BNARn, FX_BNARn},
     {FX_BNAIn, FX_BNALn, FX_BNAEn, FX_BNAEn, FX_BNALnL},
-    {FX_BNAIn, 0, 0, 0, FX_BIDICLASS_L},
+    {FX_BNAIn, 0, 0, 0, static_cast<uint32_t>(FX_BIDICLASS::kL)},
     {FX_BNAIn, FX_BNAEn, FX_BNARn, FX_BNARn, FX_BNAEn},
 };
 
@@ -230,8 +237,8 @@
     {1, 0, 1, 1},
 };
 
-int32_t Direction(int32_t val) {
-  return FX_IsOdd(val) ? FX_BIDICLASS_R : FX_BIDICLASS_L;
+FX_BIDICLASS Direction(int32_t val) {
+  return FX_IsOdd(val) ? FX_BIDICLASS::kR : FX_BIDICLASS::kL;
 }
 
 int32_t GetDeferredType(int32_t val) {
@@ -245,7 +252,7 @@
 int32_t GetDeferredNeutrals(int32_t iAction, int32_t iLevel) {
   iAction = (iAction >> 4) & 0xF;
   if (iAction == (FX_BNAEn >> 4))
-    return Direction(iLevel);
+    return static_cast<uint32_t>(Direction(iLevel));
   return iAction;
 }
 
@@ -320,20 +327,21 @@
   for (; i <= iCount; ++i) {
     CFX_Char* pTC = &(*chars)[i];
     iClsCur = pTC->m_iBidiClass;
-    if (iClsCur == FX_BIDICLASS_BN) {
+    if (iClsCur == static_cast<int32_t>(FX_BIDICLASS::kBN)) {
       pTC->m_iBidiLevel = (int16_t)iLevelCur;
       if (i == iCount && iLevelCur != 0) {
-        iClsCur = Direction(iLevelCur);
+        iClsCur = static_cast<int32_t>(Direction(iLevelCur));
         pTC->m_iBidiClass = (int16_t)iClsCur;
       } else if (i < iCount) {
         CFX_Char* pTCNext = &(*chars)[i + 1];
         int32_t iLevelNext, iLevelNew;
         iClsNew = pTCNext->m_iBidiClass;
         iLevelNext = pTCNext->m_iBidiLevel;
-        if (iClsNew != FX_BIDICLASS_BN && iLevelCur != iLevelNext) {
+        if (iClsNew != static_cast<int32_t>(FX_BIDICLASS::kBN) &&
+            iLevelCur != iLevelNext) {
           iLevelNew = std::max(iLevelNext, iLevelCur);
           pTC->m_iBidiLevel = static_cast<int16_t>(iLevelNew);
-          iClsCur = Direction(iLevelNew);
+          iClsCur = static_cast<int32_t>(Direction(iLevelNew));
           pTC->m_iBidiClass = static_cast<int16_t>(iClsCur);
           iLevelCur = iLevelNext;
         } else {
@@ -347,7 +355,7 @@
         continue;
       }
     }
-    if (iClsCur > FX_BIDICLASS_BN)
+    if (iClsCur > static_cast<int32_t>(FX_BIDICLASS::kBN))
       continue;
 
     int32_t iAction = gc_FX_BidiWeakActions[iState][iClsCur];
@@ -367,7 +375,7 @@
   if (iNum == 0)
     return;
 
-  iClsCur = Direction(0);
+  iClsCur = static_cast<int32_t>(Direction(0));
   iClsRun = GetDeferredType(gc_FX_BidiWeakActions[iState][iClsCur]);
   if (iClsRun != FX_BWAXX)
     SetDeferredRun(chars, true, i, iNum, iClsRun);
@@ -390,23 +398,23 @@
   for (; i <= iCount; ++i) {
     pTC = &(*chars)[i];
     iClsCur = pTC->m_iBidiClass;
-    if (iClsCur == FX_BIDICLASS_BN) {
+    if (iClsCur == static_cast<int32_t>(FX_BIDICLASS::kBN)) {
       if (iNum)
         ++iNum;
       continue;
     }
-    if (iClsCur >= FX_BIDICLASS_AL)
+    if (iClsCur >= static_cast<int32_t>(FX_BIDICLASS::kAL))
       continue;
 
     iAction = gc_FX_BidiNeutralActions[iState][iClsCur];
     iClsRun = GetDeferredNeutrals(iAction, iLevel);
-    if (iClsRun != FX_BIDICLASS_N && iNum > 0) {
+    if (iClsRun != static_cast<int32_t>(FX_BIDICLASS::kN) && iNum > 0) {
       SetDeferredRun(chars, true, i, iNum, iClsRun);
       iNum = 0;
     }
 
     iClsNew = GetResolvedNeutrals(iAction);
-    if (iClsNew != FX_BIDICLASS_N)
+    if (iClsNew != static_cast<int32_t>(FX_BIDICLASS::kN))
       pTC->m_iBidiClass = (int16_t)iClsNew;
     if (FX_BNAIn & iAction)
       ++iNum;
@@ -417,21 +425,21 @@
   if (iNum == 0)
     return;
 
-  iClsCur = Direction(iLevel);
+  iClsCur = static_cast<int32_t>(Direction(iLevel));
   iClsRun =
       GetDeferredNeutrals(gc_FX_BidiNeutralActions[iState][iClsCur], iLevel);
-  if (iClsRun != FX_BIDICLASS_N)
+  if (iClsRun != static_cast<int32_t>(FX_BIDICLASS::kN))
     SetDeferredRun(chars, true, i, iNum, iClsRun);
 }
 
 void ResolveImplicit(std::vector<CFX_Char>* chars, size_t iCount) {
   for (size_t i = 0; i < iCount; ++i) {
     int32_t iCls = (*chars)[i].m_iBidiClass;
-    if (iCls == FX_BIDICLASS_BN)
+    if (iCls == static_cast<int32_t>(FX_BIDICLASS::kBN) ||
+        iCls <= static_cast<int32_t>(FX_BIDICLASS::kON) ||
+        iCls >= static_cast<int32_t>(FX_BIDICLASS::kAL)) {
       continue;
-    if (iCls <= FX_BIDICLASS_ON || iCls >= FX_BIDICLASS_AL)
-      continue;
-
+    }
     int32_t iLevel = (*chars)[i].m_iBidiLevel;
     iLevel += gc_FX_BidiAddLevel[FX_IsOdd(iLevel)][iCls - 1];
     (*chars)[i].m_iBidiLevel = (int16_t)iLevel;
@@ -447,21 +455,21 @@
   size_t i = 0;
   size_t iNum = 0;
   for (; i <= iCount; ++i) {
-    switch ((*chars)[i].m_iBidiClass) {
-      case FX_BIDICLASS_WS:
+    switch (static_cast<FX_BIDICLASS>((*chars)[i].m_iBidiClass)) {
+      case FX_BIDICLASS::kWS:
         ++iNum;
         break;
-      case FX_BIDICLASS_RLE:
-      case FX_BIDICLASS_LRE:
-      case FX_BIDICLASS_LRO:
-      case FX_BIDICLASS_RLO:
-      case FX_BIDICLASS_PDF:
-      case FX_BIDICLASS_BN:
+      case FX_BIDICLASS::kRLE:
+      case FX_BIDICLASS::kLRE:
+      case FX_BIDICLASS::kLRO:
+      case FX_BIDICLASS::kRLO:
+      case FX_BIDICLASS::kPDF:
+      case FX_BIDICLASS::kBN:
         (*chars)[i].m_iBidiLevel = static_cast<int16_t>(iLevel);
         ++iNum;
         break;
-      case FX_BIDICLASS_S:
-      case FX_BIDICLASS_B:
+      case FX_BIDICLASS::kS:
+      case FX_BIDICLASS::kB:
         if (iNum > 0)
           SetDeferredRun(chars, false, i, iNum, 0);
 
@@ -547,18 +555,22 @@
 
 bool CFX_BidiChar::AppendChar(wchar_t wch) {
   uint32_t dwProps = FX_GetUnicodeProperties(wch);
-  int32_t iBidiCls = (dwProps & FX_BIDICLASSBITSMASK) >> FX_BIDICLASSBITS;
-  Direction direction = NEUTRAL;
+  FX_BIDICLASS iBidiCls = static_cast<FX_BIDICLASS>(
+      (dwProps & FX_BIDICLASSBITSMASK) >> FX_BIDICLASSBITS);
+  Direction direction;
   switch (iBidiCls) {
-    case FX_BIDICLASS_L:
-    case FX_BIDICLASS_AN:
-    case FX_BIDICLASS_EN:
+    case FX_BIDICLASS::kL:
+    case FX_BIDICLASS::kAN:
+    case FX_BIDICLASS::kEN:
       direction = LEFT;
       break;
-    case FX_BIDICLASS_R:
-    case FX_BIDICLASS_AL:
+    case FX_BIDICLASS::kR:
+    case FX_BIDICLASS::kAL:
       direction = RIGHT;
       break;
+    default:
+      direction = NEUTRAL;
+      break;
   }
 
   bool bChangeDirection = (direction != m_CurrentSegment.direction);