Remove fx_ucddata.{h,cpp} (part 3 of ucd cleanup)

Fold it into fx_unicode.h, now that all the big data is
in an external .inc file.

Change-Id: I5dc1dc742a6156ff20e8e68212f50643566fecd7
Reviewed-on: https://pdfium-review.googlesource.com/c/47914
Commit-Queue: Tom Sepez <tsepez@chromium.org>
Reviewed-by: Lei Zhang <thestig@chromium.org>
diff --git a/core/fxcrt/BUILD.gn b/core/fxcrt/BUILD.gn
index 6ef7bd7..3b17d00 100644
--- a/core/fxcrt/BUILD.gn
+++ b/core/fxcrt/BUILD.gn
@@ -52,8 +52,6 @@
     "fx_string.h",
     "fx_system.cpp",
     "fx_system.h",
-    "fx_ucddata.cpp",
-    "fx_ucddata.h",
     "fx_unicode.cpp",
     "fx_unicode.h",
     "maybe_owned.h",
diff --git a/core/fxcrt/fx_ucddata.cpp b/core/fxcrt/fx_ucddata.cpp
deleted file mode 100644
index e768651..0000000
--- a/core/fxcrt/fx_ucddata.cpp
+++ /dev/null
@@ -1,107 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "core/fxcrt/fx_ucddata.h"
-
-#include "core/fxcrt/fx_memory.h"
-
-namespace fxcrt {
-
-#undef CHARPROP____
-#define CHARPROP____(mirror, f2, ct, bd, bt)            \
-  ((mirror << kMirrorBitPos) | (f2 << kField2BitPos) |  \
-   (ct << kCharTypeBitPos) | (bd << kBidiClassBitPos) | \
-   (bt << kBreakTypeBitPos))
-
-const uint32_t kTextLayoutCodeProperties[] = {
-#include "core/fxcrt/fx_ucddata.inc"
-};
-#undef CHARPROP____
-
-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,
-    0x201D, 0x201C, 0x203A, 0x2039, 0x2046, 0x2045, 0x207E, 0x207D, 0x208E,
-    0x208D, 0x220B, 0x220C, 0x220D, 0x2208, 0x2209, 0x220A, 0x29F5, 0x223D,
-    0x223C, 0x22CD, 0x2253, 0x2252, 0x2255, 0x2254, 0x2265, 0x2264, 0x2267,
-    0x2266, 0x2269, 0x2268, 0x226B, 0x226A, 0x226F, 0x226E, 0x2271, 0x2270,
-    0x2273, 0x2272, 0x2275, 0x2274, 0x2277, 0x2276, 0x2279, 0x2278, 0x227B,
-    0x227A, 0x227D, 0x227C, 0x227F, 0x227E, 0x2281, 0x2280, 0x2283, 0x2282,
-    0x2285, 0x2284, 0x2287, 0x2286, 0x2289, 0x2288, 0x228B, 0x228A, 0x2290,
-    0x228F, 0x2292, 0x2291, 0x29B8, 0x22A3, 0x22A2, 0x2ADE, 0x2AE4, 0x2AE3,
-    0x2AE5, 0x22B1, 0x22B0, 0x22B3, 0x22B2, 0x22B5, 0x22B4, 0x22B7, 0x22B6,
-    0x22CA, 0x22C9, 0x22CC, 0x22CB, 0x2243, 0x22D1, 0x22D0, 0x22D7, 0x22D6,
-    0x22D9, 0x22D8, 0x22DB, 0x22DA, 0x22DD, 0x22DC, 0x22DF, 0x22DE, 0x22E1,
-    0x22E0, 0x22E3, 0x22E2, 0x22E5, 0x22E4, 0x22E7, 0x22E6, 0x22E9, 0x22E8,
-    0x22EB, 0x22EA, 0x22ED, 0x22EC, 0x22F1, 0x22F0, 0x22FA, 0x22FB, 0x22FC,
-    0x22FD, 0x22FE, 0x22F2, 0x22F3, 0x22F4, 0x22F6, 0x22F7, 0x2309, 0x2308,
-    0x230B, 0x230A, 0x232A, 0x2329, 0x2769, 0x2768, 0x276B, 0x276A, 0x276D,
-    0x276C, 0x276F, 0x276E, 0x2771, 0x2770, 0x2773, 0x2772, 0x2775, 0x2774,
-    0x27C4, 0x27C3, 0x27C6, 0x27C5, 0x27C9, 0x27C8, 0x27D6, 0x27D5, 0x27DE,
-    0x27DD, 0x27E3, 0x27E2, 0x27E5, 0x27E4, 0x27E7, 0x27E6, 0x27E9, 0x27E8,
-    0x27EB, 0x27EA, 0x27ED, 0x27EC, 0x27EF, 0x27EE, 0x2984, 0x2983, 0x2986,
-    0x2985, 0x2988, 0x2987, 0x298A, 0x2989, 0x298C, 0x298B, 0x2990, 0x298F,
-    0x298E, 0x298D, 0x2992, 0x2991, 0x2994, 0x2993, 0x2996, 0x2995, 0x2998,
-    0x2997, 0x2298, 0x29C1, 0x29C0, 0x29C5, 0x29C4, 0x29D0, 0x29CF, 0x29D2,
-    0x29D1, 0x29D5, 0x29D4, 0x29D9, 0x29D8, 0x29DB, 0x29DA, 0x2215, 0x29F9,
-    0x29F8, 0x29FD, 0x29FC, 0x2A2C, 0x2A2B, 0x2A2E, 0x2A2D, 0x2A35, 0x2A34,
-    0x2A3D, 0x2A3C, 0x2A65, 0x2A64, 0x2A7A, 0x2A79, 0x2A7E, 0x2A7D, 0x2A80,
-    0x2A7F, 0x2A82, 0x2A81, 0x2A84, 0x2A83, 0x2A8C, 0x2A8B, 0x2A92, 0x2A91,
-    0x2A94, 0x2A93, 0x2A96, 0x2A95, 0x2A98, 0x2A97, 0x2A9A, 0x2A99, 0x2A9C,
-    0x2A9B, 0x2AA2, 0x2AA1, 0x2AA7, 0x2AA6, 0x2AA9, 0x2AA8, 0x2AAB, 0x2AAA,
-    0x2AAD, 0x2AAC, 0x2AB0, 0x2AAF, 0x2AB4, 0x2AB3, 0x2ABC, 0x2ABB, 0x2ABE,
-    0x2ABD, 0x2AC0, 0x2ABF, 0x2AC2, 0x2AC1, 0x2AC4, 0x2AC3, 0x2AC6, 0x2AC5,
-    0x2ACE, 0x2ACD, 0x2AD0, 0x2ACF, 0x2AD2, 0x2AD1, 0x2AD4, 0x2AD3, 0x2AD6,
-    0x2AD5, 0x22A6, 0x22A9, 0x22A8, 0x22AB, 0x2AED, 0x2AEC, 0x2AF8, 0x2AF7,
-    0x2AFA, 0x2AF9, 0x2E03, 0x2E02, 0x2E05, 0x2E04, 0x2E0A, 0x2E09, 0x2E0D,
-    0x2E0C, 0x2E1D, 0x2E1C, 0x2E21, 0x2E20, 0x2E23, 0x2E22, 0x2E25, 0x2E24,
-    0x2E27, 0x2E26, 0x2E29, 0x2E28, 0x3009, 0x3008, 0x300B, 0x300A, 0x300D,
-    0x300C, 0x300F, 0x300E, 0x3011, 0x3010, 0x3015, 0x3014, 0x3017, 0x3016,
-    0x3019, 0x3018, 0x301B, 0x301A, 0xFE5A, 0xFE59, 0xFE5C, 0xFE5B, 0xFE5E,
-    0xFE5D, 0xFE65, 0xFE64, 0xFF09, 0xFF08, 0xFF1E, 0xFF1C, 0xFF3D, 0xFF3B,
-    0xFF5D, 0xFF5B, 0xFF60, 0xFF5F, 0xFF63, 0xFF62, 0xFFFF, 0xFEFF, 0xFEFF,
-    0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF,
-    0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF,
-    0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF,
-    0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF,
-    0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF,
-    0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF,
-    0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF,
-    0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF,
-    0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF,
-    0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF,
-    0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF,
-    0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF,
-    0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF,
-    0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF,
-    0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF,
-    0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF,
-};
-
-const size_t kFXTextLayoutBidiMirrorSize =
-    FX_ArraySize(kFXTextLayoutBidiMirror);
-
-}  // namespace fxcrt
diff --git a/core/fxcrt/fx_ucddata.h b/core/fxcrt/fx_ucddata.h
deleted file mode 100644
index 3296333..0000000
--- a/core/fxcrt/fx_ucddata.h
+++ /dev/null
@@ -1,69 +0,0 @@
-// Copyright 2017 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef CORE_FXCRT_FX_UCDDATA_H_
-#define CORE_FXCRT_FX_UCDDATA_H_
-
-#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 303ef34..5d7ed10 100644
--- a/core/fxcrt/fx_unicode.cpp
+++ b/core/fxcrt/fx_unicode.cpp
@@ -6,10 +6,131 @@
 
 #include "core/fxcrt/fx_unicode.h"
 
-#include "core/fxcrt/fx_ucddata.h"
+#include "core/fxcrt/fx_memory.h"
 
 namespace {
 
+// 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);
+
+#undef CHARPROP____
+#define CHARPROP____(mirror, f2, ct, bd, bt)            \
+  ((mirror << kMirrorBitPos) | (f2 << kField2BitPos) |  \
+   (ct << kCharTypeBitPos) | (bd << kBidiClassBitPos) | \
+   (bt << kBreakTypeBitPos))
+
+const uint32_t kTextLayoutCodeProperties[] = {
+#include "core/fxcrt/fx_ucddata.inc"
+};
+#undef CHARPROP____
+
+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,
+    0x201D, 0x201C, 0x203A, 0x2039, 0x2046, 0x2045, 0x207E, 0x207D, 0x208E,
+    0x208D, 0x220B, 0x220C, 0x220D, 0x2208, 0x2209, 0x220A, 0x29F5, 0x223D,
+    0x223C, 0x22CD, 0x2253, 0x2252, 0x2255, 0x2254, 0x2265, 0x2264, 0x2267,
+    0x2266, 0x2269, 0x2268, 0x226B, 0x226A, 0x226F, 0x226E, 0x2271, 0x2270,
+    0x2273, 0x2272, 0x2275, 0x2274, 0x2277, 0x2276, 0x2279, 0x2278, 0x227B,
+    0x227A, 0x227D, 0x227C, 0x227F, 0x227E, 0x2281, 0x2280, 0x2283, 0x2282,
+    0x2285, 0x2284, 0x2287, 0x2286, 0x2289, 0x2288, 0x228B, 0x228A, 0x2290,
+    0x228F, 0x2292, 0x2291, 0x29B8, 0x22A3, 0x22A2, 0x2ADE, 0x2AE4, 0x2AE3,
+    0x2AE5, 0x22B1, 0x22B0, 0x22B3, 0x22B2, 0x22B5, 0x22B4, 0x22B7, 0x22B6,
+    0x22CA, 0x22C9, 0x22CC, 0x22CB, 0x2243, 0x22D1, 0x22D0, 0x22D7, 0x22D6,
+    0x22D9, 0x22D8, 0x22DB, 0x22DA, 0x22DD, 0x22DC, 0x22DF, 0x22DE, 0x22E1,
+    0x22E0, 0x22E3, 0x22E2, 0x22E5, 0x22E4, 0x22E7, 0x22E6, 0x22E9, 0x22E8,
+    0x22EB, 0x22EA, 0x22ED, 0x22EC, 0x22F1, 0x22F0, 0x22FA, 0x22FB, 0x22FC,
+    0x22FD, 0x22FE, 0x22F2, 0x22F3, 0x22F4, 0x22F6, 0x22F7, 0x2309, 0x2308,
+    0x230B, 0x230A, 0x232A, 0x2329, 0x2769, 0x2768, 0x276B, 0x276A, 0x276D,
+    0x276C, 0x276F, 0x276E, 0x2771, 0x2770, 0x2773, 0x2772, 0x2775, 0x2774,
+    0x27C4, 0x27C3, 0x27C6, 0x27C5, 0x27C9, 0x27C8, 0x27D6, 0x27D5, 0x27DE,
+    0x27DD, 0x27E3, 0x27E2, 0x27E5, 0x27E4, 0x27E7, 0x27E6, 0x27E9, 0x27E8,
+    0x27EB, 0x27EA, 0x27ED, 0x27EC, 0x27EF, 0x27EE, 0x2984, 0x2983, 0x2986,
+    0x2985, 0x2988, 0x2987, 0x298A, 0x2989, 0x298C, 0x298B, 0x2990, 0x298F,
+    0x298E, 0x298D, 0x2992, 0x2991, 0x2994, 0x2993, 0x2996, 0x2995, 0x2998,
+    0x2997, 0x2298, 0x29C1, 0x29C0, 0x29C5, 0x29C4, 0x29D0, 0x29CF, 0x29D2,
+    0x29D1, 0x29D5, 0x29D4, 0x29D9, 0x29D8, 0x29DB, 0x29DA, 0x2215, 0x29F9,
+    0x29F8, 0x29FD, 0x29FC, 0x2A2C, 0x2A2B, 0x2A2E, 0x2A2D, 0x2A35, 0x2A34,
+    0x2A3D, 0x2A3C, 0x2A65, 0x2A64, 0x2A7A, 0x2A79, 0x2A7E, 0x2A7D, 0x2A80,
+    0x2A7F, 0x2A82, 0x2A81, 0x2A84, 0x2A83, 0x2A8C, 0x2A8B, 0x2A92, 0x2A91,
+    0x2A94, 0x2A93, 0x2A96, 0x2A95, 0x2A98, 0x2A97, 0x2A9A, 0x2A99, 0x2A9C,
+    0x2A9B, 0x2AA2, 0x2AA1, 0x2AA7, 0x2AA6, 0x2AA9, 0x2AA8, 0x2AAB, 0x2AAA,
+    0x2AAD, 0x2AAC, 0x2AB0, 0x2AAF, 0x2AB4, 0x2AB3, 0x2ABC, 0x2ABB, 0x2ABE,
+    0x2ABD, 0x2AC0, 0x2ABF, 0x2AC2, 0x2AC1, 0x2AC4, 0x2AC3, 0x2AC6, 0x2AC5,
+    0x2ACE, 0x2ACD, 0x2AD0, 0x2ACF, 0x2AD2, 0x2AD1, 0x2AD4, 0x2AD3, 0x2AD6,
+    0x2AD5, 0x22A6, 0x22A9, 0x22A8, 0x22AB, 0x2AED, 0x2AEC, 0x2AF8, 0x2AF7,
+    0x2AFA, 0x2AF9, 0x2E03, 0x2E02, 0x2E05, 0x2E04, 0x2E0A, 0x2E09, 0x2E0D,
+    0x2E0C, 0x2E1D, 0x2E1C, 0x2E21, 0x2E20, 0x2E23, 0x2E22, 0x2E25, 0x2E24,
+    0x2E27, 0x2E26, 0x2E29, 0x2E28, 0x3009, 0x3008, 0x300B, 0x300A, 0x300D,
+    0x300C, 0x300F, 0x300E, 0x3011, 0x3010, 0x3015, 0x3014, 0x3017, 0x3016,
+    0x3019, 0x3018, 0x301B, 0x301A, 0xFE5A, 0xFE59, 0xFE5C, 0xFE5B, 0xFE5E,
+    0xFE5D, 0xFE65, 0xFE64, 0xFF09, 0xFF08, 0xFF1E, 0xFF1C, 0xFF3D, 0xFF3B,
+    0xFF5D, 0xFF5B, 0xFF60, 0xFF5F, 0xFF63, 0xFF62, 0xFFFF, 0xFEFF, 0xFEFF,
+    0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF,
+    0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF,
+    0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF,
+    0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF,
+    0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF,
+    0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF,
+    0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF,
+    0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF,
+    0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF,
+    0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF,
+    0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF,
+    0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF,
+    0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF,
+    0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF,
+    0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF,
+    0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF,
+};
+
+const size_t kFXTextLayoutBidiMirrorSize =
+    FX_ArraySize(kFXTextLayoutBidiMirror);
+
 wchar_t GetMirrorChar(wchar_t wch, uint32_t dwProps) {
   uint32_t dwTemp = (dwProps & kMirrorBitMask);
   if (dwTemp == kMirrorBitMask)