Fix unsafe-buffer usage in CXFA_ContentLayoutProcessor

Convert to std::array<> as necessary.

Change-Id: I89cf636646e20de2dffb72c773b1fec800e9276c
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/119832
Reviewed-by: Lei Zhang <thestig@chromium.org>
Reviewed-by: Thomas Sepez <tsepez@google.com>
Commit-Queue: Tom Sepez <tsepez@chromium.org>
diff --git a/xfa/fxfa/layout/cxfa_contentlayoutprocessor.cpp b/xfa/fxfa/layout/cxfa_contentlayoutprocessor.cpp
index b568b96..e09a417 100644
--- a/xfa/fxfa/layout/cxfa_contentlayoutprocessor.cpp
+++ b/xfa/fxfa/layout/cxfa_contentlayoutprocessor.cpp
@@ -4,14 +4,10 @@
 
 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
 
-#if defined(UNSAFE_BUFFERS_BUILD)
-// TODO(crbug.com/pdfium/2154): resolve buffer safety issues.
-#pragma allow_unsafe_buffers
-#endif
-
 #include "xfa/fxfa/layout/cxfa_contentlayoutprocessor.h"
 
 #include <algorithm>
+#include <array>
 #include <utility>
 #include <vector>
 
@@ -42,6 +38,14 @@
 
 namespace {
 
+using NextPosRow = std::array<uint8_t, 9>;
+constexpr std::array<const NextPosRow, 4> kNextPosTable = {{
+    {{0, 1, 2, 3, 4, 5, 6, 7, 8}},
+    {{6, 3, 0, 7, 4, 1, 8, 5, 2}},
+    {{8, 7, 6, 5, 4, 3, 2, 1, 0}},
+    {{2, 5, 8, 1, 4, 7, 0, 3, 6}},
+}};
+
 std::vector<WideString> SeparateStringOnSpace(
     pdfium::span<const wchar_t> spStr) {
   std::vector<WideString> ret;
@@ -593,18 +597,13 @@
     default:
       break;
   }
-  static const uint8_t nNextPos[4][9] = {{0, 1, 2, 3, 4, 5, 6, 7, 8},
-                                         {6, 3, 0, 7, 4, 1, 8, 5, 2},
-                                         {8, 7, 6, 5, 4, 3, 2, 1, 0},
-                                         {2, 5, 8, 1, 4, 7, 0, 3, 6}};
-
   CFX_PointF pos(
       pNode->JSObject()->GetMeasureInUnit(XFA_Attribute::X, XFA_Unit::Pt),
       pNode->JSObject()->GetMeasureInUnit(XFA_Attribute::Y, XFA_Unit::Pt));
   int32_t nRotate =
       XFA_MapRotation(pNode->JSObject()->GetInteger(XFA_Attribute::Rotate)) /
       90;
-  int32_t nAbsoluteAnchorType = nNextPos[nRotate][nAnchorType];
+  int32_t nAbsoluteAnchorType = kNextPosTable[nRotate][nAnchorType];
   switch (nAbsoluteAnchorType / 3) {
     case 1:
       pos.y -= size.height / 2;
@@ -1923,8 +1922,8 @@
     float fContentCurRowHeight,
     float fContentWidthLimit,
     bool bRootForceTb) {
-  int32_t nGroupLengths[3] = {0, 0, 0};
-  float fGroupWidths[3] = {0, 0, 0};
+  std::array<int32_t, 3> nGroupLengths = {};
+  std::array<float, 3> fGroupWidths = {};
   int32_t nTotalLength = 0;
   for (int32_t i = 0; i < 3; i++) {
     nGroupLengths[i] = fxcrt::CollectionSize<int32_t>(rgCurLineLayoutItems[i]);