Replace SkTDArray usage for `SkiaState::m_commands`.

Switch to using DataVector to store the enums. Change
FxPartitionAllocAllocator to allow data partition memory allocations for
enums.

Bug: pdfium:1974
Change-Id: I19175bc1e7004262678e2e99a5172d428ed68ccf
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/103470
Reviewed-by: Tom Sepez <tsepez@chromium.org>
Commit-Queue: Lei Zhang <thestig@chromium.org>
diff --git a/core/fxcrt/fx_memory_wrappers.h b/core/fxcrt/fx_memory_wrappers.h
index 943ea12..9e87754 100644
--- a/core/fxcrt/fx_memory_wrappers.h
+++ b/core/fxcrt/fx_memory_wrappers.h
@@ -34,7 +34,7 @@
 struct FxPartitionAllocAllocator {
  public:
 #if !defined(COMPILER_MSVC) || defined(NDEBUG)
-  static_assert(std::is_arithmetic<T>::value ||
+  static_assert(std::is_arithmetic<T>::value || std::is_enum<T>::value ||
                     IsFXDataPartitionException<T>::value,
                 "Only numeric types allowed in this partition");
 #endif
@@ -90,6 +90,7 @@
 // general partition, ensuring they contain data only.
 template <typename T,
           typename = std::enable_if_t<std::is_arithmetic<T>::value ||
+                                      std::is_enum<T>::value ||
                                       IsFXDataPartitionException<T>::value>>
 using FxAllocAllocator =
     FxPartitionAllocAllocator<T, pdfium::internal::AllocOrDie>;
diff --git a/core/fxge/skia/fx_skia_device.cpp b/core/fxge/skia/fx_skia_device.cpp
index 5dd6239..42b8a79 100644
--- a/core/fxge/skia/fx_skia_device.cpp
+++ b/core/fxge/skia/fx_skia_device.cpp
@@ -742,7 +742,8 @@
                 uint32_t stroke_color,
                 const CFX_FillRenderOptions& fill_options,
                 BlendMode blend_type) {
-    int drawIndex = std::min(m_drawIndex, m_commands.size());
+    int drawIndex = std::min(
+        m_drawIndex, pdfium::base::checked_cast<int>(m_commands.size()));
     if (Accumulator::kText == m_type || drawIndex != m_commandIndex ||
         (Accumulator::kPath == m_type &&
          DrawChanged(pMatrix, pDrawState, fill_color, stroke_color,
@@ -872,7 +873,8 @@
       Flush();
       return false;
     }
-    int drawIndex = std::min(m_drawIndex, m_commands.size());
+    int drawIndex = std::min(
+        m_drawIndex, pdfium::base::checked_cast<int>(m_commands.size()));
     if (Accumulator::kPath == m_type || drawIndex != m_commandIndex ||
         (Accumulator::kText == m_type &&
          (FontChanged(pFont, matrix, font_size, scaleX, color, options) ||
@@ -1026,7 +1028,7 @@
 
   void SetClip(const SkPath& skClipPath) {
     // if a pending draw depends on clip state that is cached, flush it and draw
-    if (m_commandIndex < m_commands.size()) {
+    if (fxcrt::IndexInBounds(m_commands, m_commandIndex)) {
       if (m_commands[m_commandIndex] == Clip::kPath &&
           m_clips[m_commandIndex] == skClipPath) {
         ++m_commandIndex;
@@ -1041,7 +1043,7 @@
       } while (m_commands[m_clipIndex] != Clip::kSave);
       m_pDriver->SkiaCanvas()->restore();
     }
-    if (m_commandIndex < m_commands.size()) {
+    if (fxcrt::IndexInBounds(m_commands, m_commandIndex)) {
       m_commands[m_commandIndex] = Clip::kPath;
       m_clips[m_commandIndex] = skClipPath;
     } else {
@@ -1087,7 +1089,7 @@
   }
 
   void ClipSave() {
-    int count = m_commands.size();
+    int count = pdfium::base::checked_cast<int>(m_commands.size());
     if (m_commandIndex < count) {
       if (Clip::kSave == m_commands[m_commandIndex]) {
         ++m_commandIndex;
@@ -1195,7 +1197,8 @@
 
   void Flush() {
     if (Accumulator::kPath == m_type || Accumulator::kText == m_type) {
-      AdjustClip(std::min(m_drawIndex, m_commands.size()));
+      AdjustClip(std::min(m_drawIndex,
+                          pdfium::base::checked_cast<int>(m_commands.size())));
       Accumulator::kPath == m_type ? FlushPath() : FlushText();
     }
   }
@@ -1245,7 +1248,7 @@
   };
 
   SkTArray<SkPath> m_clips;        // stack of clips that may be reused
-  SkTDArray<Clip> m_commands;      // stack of clip-related commands
+  DataVector<Clip> m_commands;     // stack of clip-related commands
   CharDetail m_charDetails;
   SkTDArray<SkRSXform> m_rsxform;  // accumulator for txt rotate/scale/translate
   SkPath m_skPath;                 // accumulator for path contours
@@ -1264,9 +1267,10 @@
   uint32_t m_fillColor = 0;
   uint32_t m_strokeColor = 0;
   BlendMode m_blendType = BlendMode::kNormal;
+  // TODO(thestig): Consider using size_t for these index member variables.
   int m_commandIndex = 0;     // active position in clip command stack
   int m_drawIndex = INT_MAX;  // position of the pending path or text draw
-  int m_clipIndex = 0;        // position reflecting depth of canvas clip stacck
+  int m_clipIndex = 0;        // position reflecting depth of canvas clip stack
   int m_italicAngle = 0;
   Accumulator m_type = Accumulator::kNone;  // type of pending draw
   bool m_fillPath = false;