Cleanup fx_ucddata.h, part 1.

First step at hiding internal representation of this packed
uint32_t table from its callers.

Change-Id: I014fd72af26483fe77d785eb5ec5a93abbd45687
Reviewed-on: https://pdfium-review.googlesource.com/c/47911
Reviewed-by: Lei Zhang <thestig@chromium.org>
Commit-Queue: Tom Sepez <tsepez@chromium.org>
diff --git a/core/fxcrt/fx_ucddata.cpp b/core/fxcrt/fx_ucddata.cpp
index 527eacf..7985f94 100644
--- a/core/fxcrt/fx_ucddata.cpp
+++ b/core/fxcrt/fx_ucddata.cpp
@@ -8,6 +8,8 @@
 
 #include "core/fxcrt/fx_memory.h"
 
+namespace fxcrt {
+
 const uint32_t kTextLayoutCodeProperties[] = {
     0xfffe9a93, 0xfffe9a93, 0xfffe9a93, 0xfffe9a93, 0xfffe9a93, 0xfffe9a93,
     0xfffe9a93, 0xfffe9a93, 0xfffe9a93, 0xfffe8ae5, 0xfffe9b5c, 0xfffe9ada,
@@ -10937,6 +10939,23 @@
 const size_t kTextLayoutCodePropertiesSize =
     FX_ArraySize(kTextLayoutCodeProperties);
 
+static_assert(kTextLayoutCodePropertiesSize == 65536, "missing characters");
+
+static_assert((kBreakTypeBitMask | kBidiClassBitMask | kCharTypeBitMask |
+               kField2BitMask | kMirrorBitMask) == 0xffffffff,
+              "missing bits in mask");
+
+static_assert((kBreakTypeBitMask & kBidiClassBitMask) == 0, "overlapping bits");
+static_assert((kBreakTypeBitMask & kCharTypeBitMask) == 0, "overlapping bits");
+static_assert((kBreakTypeBitMask & kField2BitMask) == 0, "overlapping bits");
+static_assert((kBreakTypeBitMask & kMirrorBitMask) == 0, "overlapping bits");
+static_assert((kBidiClassBitMask & kCharTypeBitMask) == 0, "overlapping bits");
+static_assert((kBidiClassBitMask & kField2BitMask) == 0, "overlapping bits");
+static_assert((kBidiClassBitMask & kMirrorBitMask) == 0, "overlapping bits");
+static_assert((kCharTypeBitMask & kField2BitMask) == 0, "overlapping bits");
+static_assert((kCharTypeBitMask & kMirrorBitMask) == 0, "overlapping bits");
+static_assert((kField2BitMask & kMirrorBitMask) == 0, "overlapping bits");
+
 const uint16_t kFXTextLayoutBidiMirror[] = {
     0x0029, 0x0028, 0x003E, 0x003C, 0x005D, 0x005B, 0x007D, 0x007B, 0x00BB,
     0x00AB, 0x0F3B, 0x0F3A, 0x0F3D, 0x0F3C, 0x169C, 0x169B, 0x2019, 0x2018,
@@ -10999,3 +11018,5 @@
 
 const size_t kFXTextLayoutBidiMirrorSize =
     FX_ArraySize(kFXTextLayoutBidiMirror);
+
+}  // namespace fxcrt
diff --git a/core/fxcrt/fx_ucddata.h b/core/fxcrt/fx_ucddata.h
index 78a6b97..3296333 100644
--- a/core/fxcrt/fx_ucddata.h
+++ b/core/fxcrt/fx_ucddata.h
@@ -9,10 +9,61 @@
 
 #include "core/fxcrt/fx_system.h"
 
+namespace fxcrt {
+
+// Format of uint32_t values in kTextLayoutCodeProperties[].
+constexpr uint32_t kBreakTypeBitPos = 0;
+constexpr uint32_t kBreakTypeBitCount = 6;
+constexpr uint32_t kBreakTypeBitMask =
+    (((1u << kBreakTypeBitCount) - 1) << kBreakTypeBitPos);
+
+constexpr uint32_t kBidiClassBitPos = 6;
+constexpr uint32_t kBidiClassBitCount = 5;
+constexpr uint32_t kBidiClassBitMask =
+    (((1u << kBidiClassBitCount) - 1) << kBidiClassBitPos);
+
+constexpr uint32_t kCharTypeBitPos = 11;
+constexpr uint32_t kCharTypeBitCount = 4;
+constexpr uint32_t kCharTypeBitMask =
+    (((1u << kCharTypeBitCount) - 1) << kCharTypeBitPos);
+
+// TODO(tsepez): Unknown, possibly unused field.
+constexpr uint32_t kField2BitPos = 15;
+constexpr uint32_t kField2BitCount = 8;
+constexpr uint32_t kField2BitMask =
+    (((1 << kField2BitCount) - 1) << kField2BitPos);
+
+constexpr uint32_t kMirrorBitPos = 23;
+constexpr uint32_t kMirrorBitCount = 9;
+constexpr uint32_t kMirrorBitMask =
+    (((1 << kMirrorBitCount) - 1) << kMirrorBitPos);
+
 extern const uint32_t kTextLayoutCodeProperties[];
 extern const size_t kTextLayoutCodePropertiesSize;
 
 extern const uint16_t kFXTextLayoutBidiMirror[];
 extern const size_t kFXTextLayoutBidiMirrorSize;
 
+}  // namespace fxcrt
+
+using fxcrt::kBidiClassBitCount;
+using fxcrt::kBidiClassBitMask;
+using fxcrt::kBidiClassBitPos;
+using fxcrt::kBreakTypeBitCount;
+using fxcrt::kBreakTypeBitMask;
+using fxcrt::kBreakTypeBitPos;
+using fxcrt::kCharTypeBitCount;
+using fxcrt::kCharTypeBitMask;
+using fxcrt::kCharTypeBitPos;
+using fxcrt::kField2BitCount;
+using fxcrt::kField2BitMask;
+using fxcrt::kField2BitPos;
+using fxcrt::kFXTextLayoutBidiMirror;
+using fxcrt::kFXTextLayoutBidiMirrorSize;
+using fxcrt::kMirrorBitCount;
+using fxcrt::kMirrorBitMask;
+using fxcrt::kMirrorBitPos;
+using fxcrt::kTextLayoutCodeProperties;
+using fxcrt::kTextLayoutCodePropertiesSize;
+
 #endif  // CORE_FXCRT_FX_UCDDATA_H_
diff --git a/core/fxcrt/fx_unicode.cpp b/core/fxcrt/fx_unicode.cpp
index aafdba1..303ef34 100644
--- a/core/fxcrt/fx_unicode.cpp
+++ b/core/fxcrt/fx_unicode.cpp
@@ -10,14 +10,11 @@
 
 namespace {
 
-constexpr uint32_t kMirrorBits = 23;
-constexpr uint32_t kMirrorMask = 0x1FFU << kMirrorBits;
-
 wchar_t GetMirrorChar(wchar_t wch, uint32_t dwProps) {
-  uint32_t dwTemp = (dwProps & kMirrorMask);
-  if (dwTemp == kMirrorMask)
+  uint32_t dwTemp = (dwProps & kMirrorBitMask);
+  if (dwTemp == kMirrorBitMask)
     return wch;
-  size_t idx = dwTemp >> kMirrorBits;
+  size_t idx = dwTemp >> kMirrorBitPos;
   return idx < kFXTextLayoutBidiMirrorSize ? kFXTextLayoutBidiMirror[idx] : wch;
 }
 
@@ -35,6 +32,20 @@
 }
 
 #ifdef PDF_ENABLE_XFA
+static_assert(FX_CHARTYPEBITS == kCharTypeBitPos, "positions must match");
+
+FX_CHARTYPE GetCharTypeFromProp(uint32_t prop) {
+  uint32_t result = (prop & kCharTypeBitMask);
+  ASSERT(result <= FX_CHARTYPE_Arabic);
+  return static_cast<FX_CHARTYPE>(result);
+}
+
+uint32_t GetBreakPropertyFromProp(uint32_t prop) {
+  uint32_t result = (prop & kBreakTypeBitMask) >> kBreakTypeBitPos;
+  ASSERT(result <= kBreakPropertyTB);
+  return result;
+}
+
 wchar_t FX_GetMirrorChar(wchar_t wch, uint32_t dwProps) {
   return GetMirrorChar(wch, dwProps);
 }
diff --git a/core/fxcrt/fx_unicode.h b/core/fxcrt/fx_unicode.h
index 9611011..e701a76 100644
--- a/core/fxcrt/fx_unicode.h
+++ b/core/fxcrt/fx_unicode.h
@@ -19,7 +19,6 @@
 constexpr uint8_t kBreakPropertyTB = 37;  // Highest, don't know what this is.
 
 constexpr uint32_t FX_CHARTYPEBITS = 11;
-constexpr uint32_t FX_CHARTYPEBITSMASK = 0xF << FX_CHARTYPEBITS;
 
 enum FX_CHARTYPE {
   FX_CHARTYPE_Unknown = 0,
@@ -37,16 +36,11 @@
   FX_CHARTYPE_Arabic = (12 << FX_CHARTYPEBITS),
 };
 
-inline FX_CHARTYPE GetCharTypeFromProp(uint32_t prop) {
-  return static_cast<FX_CHARTYPE>(prop & FX_CHARTYPEBITSMASK);
-}
+FX_CHARTYPE GetCharTypeFromProp(uint32_t prop);
 
-inline uint32_t GetBreakPropertyFromProp(uint32_t prop) {
-  // Analagous to ULineBreak in icu's uchar.h, but permuted order, and a
-  // subset lacking some more recent additions.
-  ASSERT((prop & 0x3f) <= kBreakPropertyTB);
-  return prop & 0x3f;
-}
+// Analagous to ULineBreak in icu's uchar.h, but permuted order, and a
+// subset lacking some more recent additions.
+uint32_t GetBreakPropertyFromProp(uint32_t prop);
 
 wchar_t FX_GetMirrorChar(wchar_t wch, uint32_t dwProps);
 
diff --git a/xfa/fgas/layout/cfx_rtfbreak.cpp b/xfa/fgas/layout/cfx_rtfbreak.cpp
index 70a5756..70488da 100644
--- a/xfa/fgas/layout/cfx_rtfbreak.cpp
+++ b/xfa/fgas/layout/cfx_rtfbreak.cpp
@@ -752,7 +752,7 @@
     wchar_t wch = pText->pStr[i];
     int32_t iWidth = pText->pWidths[i];
     uint32_t dwProps = FX_GetUnicodeProperties(wch);
-    uint32_t dwCharType = (dwProps & FX_CHARTYPEBITSMASK);
+    uint32_t dwCharType = GetCharTypeFromProp(dwProps);
     if (iWidth == 0) {
       if (dwCharType == FX_CHARTYPE_ArabicAlef)
         wPrev = 0xFEFF;
diff --git a/xfa/fgas/layout/cfx_txtbreak.cpp b/xfa/fgas/layout/cfx_txtbreak.cpp
index 9d14305..96bf9bd 100644
--- a/xfa/fgas/layout/cfx_txtbreak.cpp
+++ b/xfa/fgas/layout/cfx_txtbreak.cpp
@@ -18,7 +18,7 @@
 namespace {
 
 bool IsCtrlCode(wchar_t ch) {
-  uint32_t dwRet = (FX_GetUnicodeProperties(ch) & FX_CHARTYPEBITSMASK);
+  uint32_t dwRet = GetCharTypeFromProp(FX_GetUnicodeProperties(ch));
   return dwRet == FX_CHARTYPE_Tab || dwRet == FX_CHARTYPE_Control;
 }
 
@@ -728,7 +728,7 @@
             int32_t iNextAbsolute = iNext + pTxtRun->iStart;
             wNext = pEngine->GetChar(iNextAbsolute);
             dwProps = FX_GetUnicodeProperties(wNext);
-            if ((dwProps & FX_CHARTYPEBITSMASK) != FX_CHARTYPE_Combination)
+            if (GetCharTypeFromProp(dwProps) != FX_CHARTYPE_Combination)
               break;
 
             iNext++;
@@ -744,7 +744,7 @@
 
             wNext = pStr[j];
             dwProps = FX_GetUnicodeProperties(wNext);
-          } while ((dwProps & FX_CHARTYPEBITSMASK) == FX_CHARTYPE_Combination);
+          } while (GetCharTypeFromProp(dwProps) == FX_CHARTYPE_Combination);
           if (i + j >= iLength)
             wNext = 0xFEFF;
         }
@@ -876,8 +876,7 @@
           }
           if (wForm == wch && wLast != 0xFEFF) {
             uint32_t dwLastProps = FX_GetUnicodeProperties(wLast);
-            if ((dwLastProps & FX_CHARTYPEBITSMASK) ==
-                FX_CHARTYPE_Combination) {
+            if (GetCharTypeFromProp(dwLastProps) == FX_CHARTYPE_Combination) {
               FX_RECT rtBox;
               if (pFont->GetCharBBox(wLast, &rtBox))
                 pCharPos->m_Origin.y -= fFontSize * rtBox.Height() / iMaxHeight;