Replace CFX_RectArray with std::vector<CFX_FloatRect>

Use RVO now that we use an array type compatible with it.

Review URL: https://codereview.chromium.org/1906903002
diff --git a/core/fpdftext/fpdf_text_int.cpp b/core/fpdftext/fpdf_text_int.cpp
index 4db4d5c..92c4097 100644
--- a/core/fpdftext/fpdf_text_int.cpp
+++ b/core/fpdftext/fpdf_text_int.cpp
@@ -260,23 +260,21 @@
   return -1;
 }
 
-void CPDF_TextPage::GetRectArray(int start,
-                                 int nCount,
-                                 CFX_RectArray* rectArray) const {
-  if (start < 0 || nCount == 0) {
-    return;
-  }
-  if (!m_bIsParsed) {
-    return;
-  }
-  CPDF_TextObject* pCurObj = NULL;
-  CFX_FloatRect rect;
-  int curPos = start;
-  FX_BOOL flagNewRect = TRUE;
+std::vector<CFX_FloatRect> CPDF_TextPage::GetRectArray(int start,
+                                                       int nCount) const {
+  if (start < 0 || nCount == 0 || !m_bIsParsed)
+    return std::vector<CFX_FloatRect>();
+
   if (nCount + start > pdfium::CollectionSize<int>(m_CharList) ||
       nCount == -1) {
     nCount = pdfium::CollectionSize<int>(m_CharList) - start;
   }
+
+  std::vector<CFX_FloatRect> rectArray;
+  CPDF_TextObject* pCurObj = nullptr;
+  CFX_FloatRect rect;
+  int curPos = start;
+  FX_BOOL flagNewRect = TRUE;
   while (nCount--) {
     PAGECHAR_INFO info_curchar = m_CharList[curPos++];
     if (info_curchar.m_Flag == FPDFTEXT_CHAR_GENERATED) {
@@ -290,7 +288,7 @@
       pCurObj = info_curchar.m_pTextObj;
     }
     if (pCurObj != info_curchar.m_pTextObj) {
-      rectArray->Add(rect);
+      rectArray.push_back(rect);
       pCurObj = info_curchar.m_pTextObj;
       flagNewRect = TRUE;
     }
@@ -343,7 +341,8 @@
       }
     }
   }
-  rectArray->Add(rect);
+  rectArray.push_back(rect);
+  return rectArray;
 }
 
 int CPDF_TextPage::GetIndexAtPos(CFX_FloatPoint point,
@@ -427,12 +426,13 @@
   return strText;
 }
 
-void CPDF_TextPage::GetRectsArrayByRect(const CFX_FloatRect& rect,
-                                        CFX_RectArray& resRectArray) const {
+std::vector<CFX_FloatRect> CPDF_TextPage::GetRectsArrayByRect(
+    const CFX_FloatRect& rect) const {
   if (!m_bIsParsed)
-    return;
+    return std::vector<CFX_FloatRect>();
 
   CFX_FloatRect curRect;
+  std::vector<CFX_FloatRect> result;
   bool flagNewRect = true;
   CPDF_TextObject* pCurObj = nullptr;
   for (auto info_curchar : m_CharList) {
@@ -446,7 +446,7 @@
       pCurObj = info_curchar.m_pTextObj;
     }
     if (pCurObj != info_curchar.m_pTextObj) {
-      resRectArray.Add(curRect);
+      result.push_back(curRect);
       pCurObj = info_curchar.m_pTextObj;
       flagNewRect = true;
     }
@@ -462,7 +462,8 @@
       curRect.top = std::max(curRect.top, info_curchar.m_CharBox.top);
     }
   }
-  resRectArray.Add(curRect);
+  result.push_back(curRect);
+  return result;
 }
 
 int CPDF_TextPage::GetIndexAtPos(FX_FLOAT x,
@@ -591,9 +592,8 @@
       nCount + start > pdfium::CollectionSize<int>(m_CharList)) {
     nCount = pdfium::CollectionSize<int>(m_CharList) - start;
   }
-  m_SelRects.RemoveAll();
-  GetRectArray(start, nCount, &m_SelRects);
-  return m_SelRects.GetSize();
+  m_SelRects = GetRectArray(start, nCount);
+  return pdfium::CollectionSize<int>(m_SelRects);
 }
 
 void CPDF_TextPage::GetRect(int rectIndex,
@@ -604,13 +604,13 @@
   if (!m_bIsParsed)
     return;
 
-  if (rectIndex < 0 || rectIndex >= m_SelRects.GetSize())
+  if (rectIndex < 0 || rectIndex >= pdfium::CollectionSize<int>(m_SelRects))
     return;
 
-  left = m_SelRects.GetAt(rectIndex).left;
-  top = m_SelRects.GetAt(rectIndex).top;
-  right = m_SelRects.GetAt(rectIndex).right;
-  bottom = m_SelRects.GetAt(rectIndex).bottom;
+  left = m_SelRects[rectIndex].left;
+  top = m_SelRects[rectIndex].top;
+  right = m_SelRects[rectIndex].right;
+  bottom = m_SelRects[rectIndex].bottom;
 }
 
 FX_BOOL CPDF_TextPage::GetBaselineRotate(int start, int end, int& Rotate) {
@@ -1997,7 +1997,7 @@
   if (!m_pTextPage) {
     return FALSE;
   }
-  m_resArray.RemoveAll();
+  m_resArray.clear();
   if (m_findNextStart == -1) {
     return FALSE;
   }
@@ -2089,7 +2089,7 @@
   m_IsFind = TRUE;
   int resStart = GetCharIndex(m_resStart);
   int resEnd = GetCharIndex(m_resEnd);
-  m_pTextPage->GetRectArray(resStart, resEnd - resStart + 1, &m_resArray);
+  m_resArray = m_pTextPage->GetRectArray(resStart, resEnd - resStart + 1);
   if (m_flags & FPDFTEXT_CONSECUTIVE) {
     m_findNextStart = m_resStart + 1;
     m_findPreStart = m_resEnd - 1;
@@ -2104,7 +2104,7 @@
   if (!m_pTextPage) {
     return FALSE;
   }
-  m_resArray.RemoveAll();
+  m_resArray.clear();
   if (m_strText.IsEmpty() || m_findPreStart < 0) {
     m_IsFind = FALSE;
     return m_IsFind;
@@ -2135,7 +2135,7 @@
   m_resStart = m_pTextPage->TextIndexFromCharIndex(order);
   m_resEnd = m_pTextPage->TextIndexFromCharIndex(order + MatchedCount - 1);
   m_IsFind = TRUE;
-  m_pTextPage->GetRectArray(order, MatchedCount, &m_resArray);
+  m_resArray = m_pTextPage->GetRectArray(order, MatchedCount);
   if (m_flags & FPDFTEXT_CONSECUTIVE) {
     m_findNextStart = m_resStart + 1;
     m_findPreStart = m_resEnd - 1;
@@ -2279,10 +2279,6 @@
   return str2;
 }
 
-void CPDF_TextPageFind::GetRectArray(CFX_RectArray& rects) const {
-  rects.Copy(m_resArray);
-}
-
 int CPDF_TextPageFind::GetCurOrder() const {
   return GetCharIndex(m_resStart);
 }
@@ -2446,9 +2442,10 @@
   return index < m_LinkArray.size() ? m_LinkArray[index].m_strUrl : L"";
 }
 
-void CPDF_LinkExtract::GetRects(size_t index, CFX_RectArray* pRects) const {
-  if (index < m_LinkArray.size()) {
-    m_pTextPage->GetRectArray(m_LinkArray[index].m_Start,
-                              m_LinkArray[index].m_Count, pRects);
-  }
+std::vector<CFX_FloatRect> CPDF_LinkExtract::GetRects(size_t index) const {
+  if (index >= m_LinkArray.size())
+    return std::vector<CFX_FloatRect>();
+
+  return m_pTextPage->GetRectArray(m_LinkArray[index].m_Start,
+                                   m_LinkArray[index].m_Count);
 }
diff --git a/core/fpdftext/include/cpdf_linkextract.h b/core/fpdftext/include/cpdf_linkextract.h
index 4f9537c..5d471e0 100644
--- a/core/fpdftext/include/cpdf_linkextract.h
+++ b/core/fpdftext/include/cpdf_linkextract.h
@@ -24,7 +24,7 @@
   void ExtractLinks();
   size_t CountLinks() const { return m_LinkArray.size(); }
   CFX_WideString GetURL(size_t index) const;
-  void GetRects(size_t index, CFX_RectArray* pRects) const;
+  std::vector<CFX_FloatRect> GetRects(size_t index) const;
 
  protected:
   void ParseLink();
diff --git a/core/fpdftext/include/cpdf_textpage.h b/core/fpdftext/include/cpdf_textpage.h
index 8d608b0..1a60a23 100644
--- a/core/fpdftext/include/cpdf_textpage.h
+++ b/core/fpdftext/include/cpdf_textpage.h
@@ -67,7 +67,7 @@
   int TextIndexFromCharIndex(int CharIndex) const;
   int CountChars() const;
   void GetCharInfo(int index, FPDF_CHAR_INFO* info) const;
-  void GetRectArray(int start, int nCount, CFX_RectArray* rectArray) const;
+  std::vector<CFX_FloatRect> GetRectArray(int start, int nCount) const;
   int GetIndexAtPos(CFX_FloatPoint point,
                     FX_FLOAT xTolerance,
                     FX_FLOAT yTolerance) const;
@@ -76,8 +76,8 @@
                     FX_FLOAT xTolerance,
                     FX_FLOAT yTolerance) const;
   CFX_WideString GetTextByRect(const CFX_FloatRect& rect) const;
-  void GetRectsArrayByRect(const CFX_FloatRect& rect,
-                           CFX_RectArray& resRectArray) const;
+  std::vector<CFX_FloatRect> GetRectsArrayByRect(
+      const CFX_FloatRect& rect) const;
   CFX_WideString GetPageText(int start = 0, int nCount = -1) const;
   int CountRects(int start, int nCount);
   void GetRect(int rectIndex,
@@ -146,7 +146,7 @@
   bool m_bIsParsed;
   CFX_Matrix m_DisplayMatrix;
   CFX_ArrayTemplate<FPDF_SEGMENT> m_Segments;
-  CFX_RectArray m_SelRects;
+  std::vector<CFX_FloatRect> m_SelRects;
   CFX_ArrayTemplate<PDFTEXT_Obj> m_LineObj;
   int32_t m_TextlineDir;
   CFX_FloatRect m_CurlineRect;
diff --git a/core/fpdftext/include/cpdf_textpagefind.h b/core/fpdftext/include/cpdf_textpagefind.h
index ec739e4..d993777 100644
--- a/core/fpdftext/include/cpdf_textpagefind.h
+++ b/core/fpdftext/include/cpdf_textpagefind.h
@@ -25,7 +25,6 @@
                     int startPos = 0);
   FX_BOOL FindNext();
   FX_BOOL FindPrev();
-  void GetRectArray(CFX_RectArray& rects) const;
   int GetCurOrder() const;
   int GetMatchedCount() const;
 
@@ -58,7 +57,7 @@
   FX_BOOL m_bMatchWholeWord;
   int m_resStart;
   int m_resEnd;
-  CFX_RectArray m_resArray;
+  std::vector<CFX_FloatRect> m_resArray;
   FX_BOOL m_IsFind;
 };
 
diff --git a/core/fxcrt/include/fx_coordinates.h b/core/fxcrt/include/fx_coordinates.h
index a7f0b8d..ec6b41c 100644
--- a/core/fxcrt/include/fx_coordinates.h
+++ b/core/fxcrt/include/fx_coordinates.h
@@ -310,7 +310,6 @@
   FX_FLOAT right;
   FX_FLOAT top;
 };
-using CFX_RectArray = CFX_ArrayTemplate<CFX_FloatRect>;
 
 // LTWH rectangles (y-axis runs downwards).
 template <class baseType>
diff --git a/fpdfsdk/fpdftext.cpp b/fpdfsdk/fpdftext.cpp
index 2a84131..4d521da 100644
--- a/fpdfsdk/fpdftext.cpp
+++ b/fpdfsdk/fpdftext.cpp
@@ -13,6 +13,7 @@
 #include "core/fpdftext/include/cpdf_textpagefind.h"
 #include "fpdfsdk/include/fsdk_define.h"
 #include "third_party/base/numerics/safe_conversions.h"
+#include "third_party/base/stl_util.h"
 
 #ifdef PDF_ENABLE_XFA
 #include "fpdfsdk/fpdfxfa/include/fpdfxfa_doc.h"
@@ -315,10 +316,8 @@
   if (!link_page || link_index < 0)
     return 0;
 
-  CFX_RectArray rects;
   CPDF_LinkExtract* pageLink = CPDFLinkExtractFromFPDFPageLink(link_page);
-  pageLink->GetRects(link_index, &rects);
-  return rects.GetSize();
+  return pdfium::CollectionSize<int>(pageLink->GetRects(link_index));
 }
 
 DLLEXPORT void STDCALL FPDFLink_GetRect(FPDF_PAGELINK link_page,
@@ -331,17 +330,15 @@
   if (!link_page || link_index < 0 || rect_index < 0)
     return;
 
-  CFX_RectArray rectArray;
   CPDF_LinkExtract* pageLink = CPDFLinkExtractFromFPDFPageLink(link_page);
-  pageLink->GetRects(link_index, &rectArray);
-  if (rect_index >= rectArray.GetSize())
+  std::vector<CFX_FloatRect> rectArray = pageLink->GetRects(link_index);
+  if (rect_index >= pdfium::CollectionSize<int>(rectArray))
     return;
 
-  CFX_FloatRect rect = rectArray.GetAt(rect_index);
-  *left = rect.left;
-  *right = rect.right;
-  *top = rect.top;
-  *bottom = rect.bottom;
+  *left = rectArray[rect_index].left;
+  *right = rectArray[rect_index].right;
+  *top = rectArray[rect_index].top;
+  *bottom = rectArray[rect_index].bottom;
 }
 
 DLLEXPORT void STDCALL FPDFLink_CloseWebLinks(FPDF_PAGELINK link_page) {
diff --git a/fpdfsdk/fsdk_mgr.cpp b/fpdfsdk/fsdk_mgr.cpp
index 7240fe1..cfb1b8a 100644
--- a/fpdfsdk/fsdk_mgr.cpp
+++ b/fpdfsdk/fsdk_mgr.cpp
@@ -1158,12 +1158,10 @@
   SetLock(FALSE);
 }
 
-void CPDFSDK_PageView::UpdateRects(CFX_RectArray& rects) {
-  for (int i = 0; i < rects.GetSize(); i++) {
-    CFX_FloatRect rc = rects.GetAt(i);
-    CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();
+void CPDFSDK_PageView::UpdateRects(const std::vector<CFX_FloatRect>& rects) {
+  CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();
+  for (const auto& rc : rects)
     pEnv->FFI_Invalidate(m_page, rc.left, rc.top, rc.right, rc.bottom);
-  }
 }
 
 void CPDFSDK_PageView::UpdateView(CPDFSDK_Annot* pAnnot) {
diff --git a/fpdfsdk/include/fsdk_mgr.h b/fpdfsdk/include/fsdk_mgr.h
index 3d691c1..0578a16 100644
--- a/fpdfsdk/include/fsdk_mgr.h
+++ b/fpdfsdk/include/fsdk_mgr.h
@@ -614,7 +614,7 @@
                        int nFlag);
   bool IsValidAnnot(const CPDF_Annot* p) const;
   void GetCurrentMatrix(CFX_Matrix& matrix) { matrix = m_curMatrix; }
-  void UpdateRects(CFX_RectArray& rects);
+  void UpdateRects(const std::vector<CFX_FloatRect>& rects);
   void UpdateView(CPDFSDK_Annot* pAnnot);
   const std::vector<CPDFSDK_Annot*>& GetAnnotList() const {
     return m_fxAnnotArray;
diff --git a/fpdfsdk/javascript/Document.cpp b/fpdfsdk/javascript/Document.cpp
index 551d649..fa2f7ae 100644
--- a/fpdfsdk/javascript/Document.cpp
+++ b/fpdfsdk/javascript/Document.cpp
@@ -494,9 +494,7 @@
     ++rcAnnot.right;
     ++rcAnnot.top;
 
-    CFX_RectArray aRefresh;
-    aRefresh.Add(rcAnnot);
-
+    std::vector<CFX_FloatRect> aRefresh(1, rcAnnot);
     UnderlyingPageType* pPage = pWidget->GetUnderlyingPage();
     ASSERT(pPage);