diff --git a/fpdfsdk/fpdf_flatten.cpp b/fpdfsdk/fpdf_flatten.cpp
index f39a50a..1b93bb4 100644
--- a/fpdfsdk/fpdf_flatten.cpp
+++ b/fpdfsdk/fpdf_flatten.cpp
@@ -19,8 +19,6 @@
 #include "fpdfsdk/fsdk_define.h"
 #include "third_party/base/stl_util.h"
 
-typedef CFX_ArrayTemplate<CFX_FloatRect> CPDF_RectArray;
-
 enum FPDF_TYPE { MAX, MIN };
 enum FPDF_VALUE { TOP, LEFT, RIGHT, BOTTOM };
 
@@ -47,7 +45,7 @@
 
 void GetContentsRect(CPDF_Document* pDoc,
                      CPDF_Dictionary* pDict,
-                     CPDF_RectArray* pRectArray) {
+                     std::vector<CFX_FloatRect>* pRectArray) {
   std::unique_ptr<CPDF_Page> pPDFPage(new CPDF_Page(pDoc, pDict, false));
   pPDFPage->ParseContent();
 
@@ -58,13 +56,13 @@
     rc.bottom = pPageObject->m_Bottom;
     rc.top = pPageObject->m_Top;
     if (IsValiableRect(rc, pDict->GetRectFor("MediaBox")))
-      pRectArray->Add(rc);
+      pRectArray->push_back(rc);
   }
 }
 
 void ParserStream(CPDF_Dictionary* pPageDic,
                   CPDF_Dictionary* pStream,
-                  CPDF_RectArray* pRectArray,
+                  std::vector<CFX_FloatRect>* pRectArray,
                   std::vector<CPDF_Dictionary*>* pObjectArray) {
   if (!pStream)
     return;
@@ -75,14 +73,14 @@
     rect = pStream->GetRectFor("BBox");
 
   if (IsValiableRect(rect, pPageDic->GetRectFor("MediaBox")))
-    pRectArray->Add(rect);
+    pRectArray->push_back(rect);
 
   pObjectArray->push_back(pStream);
 }
 
 int ParserAnnots(CPDF_Document* pSourceDoc,
                  CPDF_Dictionary* pPageDic,
-                 CPDF_RectArray* pRectArray,
+                 std::vector<CFX_FloatRect>* pRectArray,
                  std::vector<CPDF_Dictionary*>* pObjectArray,
                  int nUsage) {
   if (!pSourceDoc || !pPageDic)
@@ -120,60 +118,48 @@
   return FLATTEN_SUCCESS;
 }
 
-FX_FLOAT GetMinMaxValue(CPDF_RectArray& array,
+FX_FLOAT GetMinMaxValue(const std::vector<CFX_FloatRect>& array,
                         FPDF_TYPE type,
                         FPDF_VALUE value) {
-  int nRects = array.GetSize();
-  FX_FLOAT fRet = 0.0f;
-
+  size_t nRects = array.size();
   if (nRects <= 0)
     return 0.0f;
 
-  FX_FLOAT* pArray = new FX_FLOAT[nRects];
+  std::vector<FX_FLOAT> pArray(nRects);
   switch (value) {
-    case LEFT: {
-      for (int i = 0; i < nRects; i++)
-        pArray[i] = CFX_FloatRect(array.GetAt(i)).left;
-
+    case LEFT:
+      for (size_t i = 0; i < nRects; i++)
+        pArray[i] = array[i].left;
       break;
-    }
-    case TOP: {
-      for (int i = 0; i < nRects; i++)
-        pArray[i] = CFX_FloatRect(array.GetAt(i)).top;
-
+    case TOP:
+      for (size_t i = 0; i < nRects; i++)
+        pArray[i] = array[i].top;
       break;
-    }
-    case RIGHT: {
-      for (int i = 0; i < nRects; i++)
-        pArray[i] = CFX_FloatRect(array.GetAt(i)).right;
-
+    case RIGHT:
+      for (size_t i = 0; i < nRects; i++)
+        pArray[i] = array[i].right;
       break;
-    }
-    case BOTTOM: {
-      for (int i = 0; i < nRects; i++)
-        pArray[i] = CFX_FloatRect(array.GetAt(i)).bottom;
-
+    case BOTTOM:
+      for (size_t i = 0; i < nRects; i++)
+        pArray[i] = array[i].bottom;
       break;
-    }
     default:
       // Not reachable.
       return 0.0f;
   }
-  fRet = pArray[0];
+
+  FX_FLOAT fRet = pArray[0];
   if (type == MAX) {
-    for (int i = 1; i < nRects; i++)
-      if (fRet <= pArray[i])
-        fRet = pArray[i];
+    for (size_t i = 1; i < nRects; i++)
+      fRet = std::max(fRet, pArray[i]);
   } else {
-    for (int i = 1; i < nRects; i++)
-      if (fRet >= pArray[i])
-        fRet = pArray[i];
+    for (size_t i = 1; i < nRects; i++)
+      fRet = std::min(fRet, pArray[i]);
   }
-  delete[] pArray;
   return fRet;
 }
 
-CFX_FloatRect CalculateRect(CPDF_RectArray* pRectArray) {
+CFX_FloatRect CalculateRect(std::vector<CFX_FloatRect>* pRectArray) {
   CFX_FloatRect rcRet;
 
   rcRet.left = GetMinMaxValue(*pRectArray, MIN, LEFT);
@@ -250,45 +236,34 @@
 
 DLLEXPORT int STDCALL FPDFPage_Flatten(FPDF_PAGE page, int nFlag) {
   CPDF_Page* pPage = CPDFPageFromFPDFPage(page);
-  if (!page) {
+  if (!page)
     return FLATTEN_FAIL;
-  }
 
   CPDF_Document* pDocument = pPage->m_pDocument;
   CPDF_Dictionary* pPageDict = pPage->m_pFormDict;
-
-  if (!pDocument || !pPageDict) {
+  if (!pDocument || !pPageDict)
     return FLATTEN_FAIL;
-  }
 
   std::vector<CPDF_Dictionary*> ObjectArray;
-  CPDF_RectArray RectArray;
-
-  int iRet = FLATTEN_FAIL;
-  iRet = ParserAnnots(pDocument, pPageDict, &RectArray, &ObjectArray, nFlag);
+  std::vector<CFX_FloatRect> RectArray;
+  int iRet =
+      ParserAnnots(pDocument, pPageDict, &RectArray, &ObjectArray, nFlag);
   if (iRet == FLATTEN_NOTHINGTODO || iRet == FLATTEN_FAIL)
     return iRet;
 
   CFX_FloatRect rcOriginalCB;
   CFX_FloatRect rcMerger = CalculateRect(&RectArray);
   CFX_FloatRect rcOriginalMB = pPageDict->GetRectFor("MediaBox");
-
   if (pPageDict->KeyExist("CropBox"))
     rcOriginalMB = pPageDict->GetRectFor("CropBox");
 
-  if (rcOriginalMB.IsEmpty()) {
+  if (rcOriginalMB.IsEmpty())
     rcOriginalMB = CFX_FloatRect(0.0f, 0.0f, 612.0f, 792.0f);
-  }
 
-  rcMerger.left =
-      rcMerger.left < rcOriginalMB.left ? rcOriginalMB.left : rcMerger.left;
-  rcMerger.right =
-      rcMerger.right > rcOriginalMB.right ? rcOriginalMB.right : rcMerger.right;
-  rcMerger.top =
-      rcMerger.top > rcOriginalMB.top ? rcOriginalMB.top : rcMerger.top;
-  rcMerger.bottom = rcMerger.bottom < rcOriginalMB.bottom ? rcOriginalMB.bottom
-                                                          : rcMerger.bottom;
-
+  rcMerger.left = std::max(rcMerger.left, rcOriginalMB.left);
+  rcMerger.right = std::min(rcMerger.right, rcOriginalMB.right);
+  rcMerger.bottom = std::max(rcMerger.bottom, rcOriginalMB.bottom);
+  rcMerger.top = std::min(rcMerger.top, rcOriginalMB.top);
   if (pPageDict->KeyExist("ArtBox"))
     rcOriginalCB = pPageDict->GetRectFor("ArtBox");
   else
@@ -330,7 +305,6 @@
 
   CFX_ByteString key = "";
   int nStreams = pdfium::CollectionSize<int>(ObjectArray);
-
   if (nStreams > 0) {
     for (int iKey = 0; /*iKey < 100*/; iKey++) {
       char sExtend[5] = {};
@@ -344,7 +318,6 @@
   SetPageContents(key, pPageDict, pDocument);
 
   CPDF_Dictionary* pNewXORes = nullptr;
-
   if (!key.IsEmpty()) {
     pPageXObject->SetReferenceFor(key, pDocument, dwObjNum);
     CPDF_Dictionary* pNewOXbjectDic = pNewXObject->GetDict();
@@ -452,7 +425,5 @@
     pNewXObject->SetData(sStream.raw_str(), sStream.GetLength());
   }
   pPageDict->RemoveFor("Annots");
-
-  RectArray.RemoveAll();
   return FLATTEN_SUCCESS;
 }
