diff --git a/core/fxcrt/include/fx_basic.h b/core/fxcrt/include/fx_basic.h
index 5ec5506..7437d95 100644
--- a/core/fxcrt/include/fx_basic.h
+++ b/core/fxcrt/include/fx_basic.h
@@ -376,7 +376,6 @@
 typedef CFX_ArrayTemplate<FX_FLOAT> CFX_FloatArray;
 typedef CFX_ArrayTemplate<uint8_t> CFX_ByteArray;
 typedef CFX_ArrayTemplate<int32_t> CFX_Int32Array;
-typedef CFX_ArrayTemplate<void*> CFX_PtrArray;
 #endif  // PDF_ENABLE_XFA
 
 #ifdef PDF_ENABLE_XFA
diff --git a/xfa/fxbarcode/pdf417/BC_PDF417BarcodeValue.h b/xfa/fxbarcode/pdf417/BC_PDF417BarcodeValue.h
index 29f0a83..0be71a1 100644
--- a/xfa/fxbarcode/pdf417/BC_PDF417BarcodeValue.h
+++ b/xfa/fxbarcode/pdf417/BC_PDF417BarcodeValue.h
@@ -9,10 +9,11 @@
 
 #include "core/fxcrt/include/fx_basic.h"
 
-class CBC_BarcodeValue {
+class CBC_BarcodeValue final {
  public:
   CBC_BarcodeValue();
-  virtual ~CBC_BarcodeValue();
+  ~CBC_BarcodeValue();
+
   void setValue(int32_t value);
   CFX_Int32Array* getValue();
   int32_t getConfidence(int32_t value);
@@ -22,4 +23,7 @@
   CFX_Int32Array m_values;
 };
 
+using CBC_BarcodeValueArray = CFX_ArrayTemplate<CBC_BarcodeValue*>;
+using CBC_BarcodeValueArrayArray = CFX_ArrayTemplate<CBC_BarcodeValueArray*>;
+
 #endif  // XFA_FXBARCODE_PDF417_BC_PDF417BARCODEVALUE_H_
diff --git a/xfa/fxbarcode/pdf417/BC_PDF417ECErrorCorrection.cpp b/xfa/fxbarcode/pdf417/BC_PDF417ECErrorCorrection.cpp
index 2c96f70..6a1f46f 100644
--- a/xfa/fxbarcode/pdf417/BC_PDF417ECErrorCorrection.cpp
+++ b/xfa/fxbarcode/pdf417/BC_PDF417ECErrorCorrection.cpp
@@ -65,7 +65,7 @@
     delete syndrome;
     return -1;
   }
-  CFX_PtrArray* sigmaOmega =
+  CFX_ArrayTemplate<CBC_PDF417ECModulusPoly*>* sigmaOmega =
       runEuclideanAlgorithm(buildmonomial, syndrome, numECCodewords, e);
   delete buildmonomial;
   delete syndrome;
@@ -123,11 +123,11 @@
   delete sigmaOmega;
   return result;
 }
-CFX_PtrArray* CBC_PDF417ECErrorCorrection::runEuclideanAlgorithm(
-    CBC_PDF417ECModulusPoly* a,
-    CBC_PDF417ECModulusPoly* b,
-    int32_t R,
-    int32_t& e) {
+CFX_ArrayTemplate<CBC_PDF417ECModulusPoly*>*
+CBC_PDF417ECErrorCorrection::runEuclideanAlgorithm(CBC_PDF417ECModulusPoly* a,
+                                                   CBC_PDF417ECModulusPoly* b,
+                                                   int32_t R,
+                                                   int32_t& e) {
   if (a->getDegree() < b->getDegree()) {
     CBC_PDF417ECModulusPoly* temp = a;
     a = b;
@@ -262,7 +262,8 @@
   CBC_PDF417ECModulusPoly* omega = r->multiply(inverse, e);
   delete rtemp;
   BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
-  CFX_PtrArray* modulusPoly = new CFX_PtrArray;
+  CFX_ArrayTemplate<CBC_PDF417ECModulusPoly*>* modulusPoly =
+      new CFX_ArrayTemplate<CBC_PDF417ECModulusPoly*>();
   modulusPoly->Add(sigma);
   modulusPoly->Add(omega);
   return modulusPoly;
diff --git a/xfa/fxbarcode/pdf417/BC_PDF417ECErrorCorrection.h b/xfa/fxbarcode/pdf417/BC_PDF417ECErrorCorrection.h
index d7b56de..95e691a 100644
--- a/xfa/fxbarcode/pdf417/BC_PDF417ECErrorCorrection.h
+++ b/xfa/fxbarcode/pdf417/BC_PDF417ECErrorCorrection.h
@@ -22,10 +22,11 @@
 
  private:
   static CBC_PDF417ECModulusGF* m_field;
-  static CFX_PtrArray* runEuclideanAlgorithm(CBC_PDF417ECModulusPoly* a,
-                                             CBC_PDF417ECModulusPoly* b,
-                                             int32_t R,
-                                             int32_t& e);
+  static CFX_ArrayTemplate<CBC_PDF417ECModulusPoly*>* runEuclideanAlgorithm(
+      CBC_PDF417ECModulusPoly* a,
+      CBC_PDF417ECModulusPoly* b,
+      int32_t R,
+      int32_t& e);
   static CFX_Int32Array* findErrorLocations(
       CBC_PDF417ECModulusPoly* errorLocator,
       int32_t& e);
diff --git a/xfa/fxbarcode/pdf417/BC_PDF417Reader.cpp b/xfa/fxbarcode/pdf417/BC_PDF417Reader.cpp
index 4d953e0..e68969e 100644
--- a/xfa/fxbarcode/pdf417/BC_PDF417Reader.cpp
+++ b/xfa/fxbarcode/pdf417/BC_PDF417Reader.cpp
@@ -20,7 +20,9 @@
  * limitations under the License.
  */
 
+#include <algorithm>
 #include <limits>
+#include <memory>
 
 #include "xfa/fxbarcode/BC_BinaryBitmap.h"
 #include "xfa/fxbarcode/BC_BinaryBitmap.h"
@@ -64,27 +66,25 @@
                                         int32_t hints,
                                         int32_t& e) {
   CFX_ByteString results;
-  CBC_PDF417DetectorResult* detectorResult =
-      CBC_Detector::detect(image, hints, multiple, e);
+  std::unique_ptr<CBC_PDF417DetectorResult> detectorResult(
+      CBC_Detector::detect(image, hints, multiple, e));
   BC_EXCEPTION_CHECK_ReturnValue(e, "");
   for (int32_t i = 0; i < detectorResult->getPoints()->GetSize(); i++) {
-    CFX_PtrArray* points = (CFX_PtrArray*)detectorResult->getPoints()->GetAt(i);
-    CBC_CommonDecoderResult* ResultTemp = CBC_PDF417ScanningDecoder::decode(
-        detectorResult->getBits(), (CBC_ResultPoint*)points->GetAt(4),
-        (CBC_ResultPoint*)points->GetAt(5), (CBC_ResultPoint*)points->GetAt(6),
-        (CBC_ResultPoint*)points->GetAt(7), getMinCodewordWidth(*points),
-        getMaxCodewordWidth(*points), e);
-    if (ResultTemp == NULL) {
-      delete detectorResult;
+    CBC_ResultPointArray* points = detectorResult->getPoints()->GetAt(i);
+    std::unique_ptr<CBC_CommonDecoderResult> ResultTemp(
+        CBC_PDF417ScanningDecoder::decode(
+            detectorResult->getBits(), points->GetAt(4), points->GetAt(5),
+            points->GetAt(6), points->GetAt(7), getMinCodewordWidth(*points),
+            getMaxCodewordWidth(*points), e));
+    if (!ResultTemp) {
       e = BCExceptiontNotFoundInstance;
-      return "";
+      return CFX_ByteString();
     }
     results += ResultTemp->GetText();
-    delete ResultTemp;
   }
-  delete detectorResult;
   return results;
 }
+
 CFX_ByteString CBC_PDF417Reader::Decode(CBC_BinaryBitmap* image,
                                         int32_t hints,
                                         int32_t& e) {
@@ -105,45 +105,29 @@
     return std::numeric_limits<int32_t>::max();
   return (int32_t)FXSYS_fabs(p1->GetX() - p2->GetX());
 }
-int32_t CBC_PDF417Reader::getMaxCodewordWidth(CFX_PtrArray& p) {
-  int32_t a =
-      getMaxWidth((CBC_ResultPoint*)p.GetAt(6), (CBC_ResultPoint*)p.GetAt(2)) *
-      CBC_PDF417Common::MODULES_IN_CODEWORD /
-      CBC_PDF417Common::MODULES_IN_STOP_PATTERN;
-  int32_t b =
-      getMaxWidth((CBC_ResultPoint*)p.GetAt(7), (CBC_ResultPoint*)p.GetAt(3)) *
-      CBC_PDF417Common::MODULES_IN_CODEWORD /
-      CBC_PDF417Common::MODULES_IN_STOP_PATTERN;
-  int32_t c = getMaxWidth((CBC_ResultPoint*)p.GetAt(0),
-                          (CBC_ResultPoint*)p.GetAt(4)) < a
-                  ? getMaxWidth((CBC_ResultPoint*)p.GetAt(0),
-                                (CBC_ResultPoint*)p.GetAt(4))
-                  : a;
-  int32_t d = getMaxWidth((CBC_ResultPoint*)p.GetAt(1),
-                          (CBC_ResultPoint*)p.GetAt(5)) < b
-                  ? getMaxWidth((CBC_ResultPoint*)p.GetAt(1),
-                                (CBC_ResultPoint*)p.GetAt(5))
-                  : b;
-  return c < d ? c : d;
+
+int32_t CBC_PDF417Reader::getMaxCodewordWidth(
+    const CFX_ArrayTemplate<CBC_ResultPoint*>& p) {
+  int32_t a = getMaxWidth(p.GetAt(6), p.GetAt(2)) *
+              CBC_PDF417Common::MODULES_IN_CODEWORD /
+              CBC_PDF417Common::MODULES_IN_STOP_PATTERN;
+  int32_t b = getMaxWidth(p.GetAt(7), p.GetAt(3)) *
+              CBC_PDF417Common::MODULES_IN_CODEWORD /
+              CBC_PDF417Common::MODULES_IN_STOP_PATTERN;
+  int32_t c = std::min(a, getMaxWidth(p.GetAt(0), p.GetAt(4)));
+  int32_t d = std::min(b, getMaxWidth(p.GetAt(1), p.GetAt(5)));
+  return std::min(c, d);
 }
-int32_t CBC_PDF417Reader::getMinCodewordWidth(CFX_PtrArray& p) {
-  int32_t a =
-      getMinWidth((CBC_ResultPoint*)p.GetAt(6), (CBC_ResultPoint*)p.GetAt(2)) *
-      CBC_PDF417Common::MODULES_IN_CODEWORD /
-      CBC_PDF417Common::MODULES_IN_STOP_PATTERN;
-  int32_t b =
-      getMinWidth((CBC_ResultPoint*)p.GetAt(7), (CBC_ResultPoint*)p.GetAt(3)) *
-      CBC_PDF417Common::MODULES_IN_CODEWORD /
-      CBC_PDF417Common::MODULES_IN_STOP_PATTERN;
-  int32_t c = getMinWidth((CBC_ResultPoint*)p.GetAt(0),
-                          (CBC_ResultPoint*)p.GetAt(4)) < a
-                  ? getMinWidth((CBC_ResultPoint*)p.GetAt(0),
-                                (CBC_ResultPoint*)p.GetAt(4))
-                  : a;
-  int32_t d = getMinWidth((CBC_ResultPoint*)p.GetAt(1),
-                          (CBC_ResultPoint*)p.GetAt(5)) < b
-                  ? getMinWidth((CBC_ResultPoint*)p.GetAt(1),
-                                (CBC_ResultPoint*)p.GetAt(5))
-                  : b;
-  return c < d ? c : d;
+
+int32_t CBC_PDF417Reader::getMinCodewordWidth(
+    const CFX_ArrayTemplate<CBC_ResultPoint*>& p) {
+  int32_t a = getMinWidth(p.GetAt(6), p.GetAt(2)) *
+              CBC_PDF417Common::MODULES_IN_CODEWORD /
+              CBC_PDF417Common::MODULES_IN_STOP_PATTERN;
+  int32_t b = getMinWidth(p.GetAt(7), p.GetAt(3)) *
+              CBC_PDF417Common::MODULES_IN_CODEWORD /
+              CBC_PDF417Common::MODULES_IN_STOP_PATTERN;
+  int32_t c = std::min(a, getMinWidth(p.GetAt(0), p.GetAt(4)));
+  int32_t d = std::min(b, getMinWidth(p.GetAt(1), p.GetAt(5)));
+  return std::min(c, d);
 }
diff --git a/xfa/fxbarcode/pdf417/BC_PDF417Reader.h b/xfa/fxbarcode/pdf417/BC_PDF417Reader.h
index 808de29..73499b9 100644
--- a/xfa/fxbarcode/pdf417/BC_PDF417Reader.h
+++ b/xfa/fxbarcode/pdf417/BC_PDF417Reader.h
@@ -28,8 +28,10 @@
  private:
   static int32_t getMaxWidth(CBC_ResultPoint* p1, CBC_ResultPoint* p2);
   static int32_t getMinWidth(CBC_ResultPoint* p1, CBC_ResultPoint* p2);
-  static int32_t getMaxCodewordWidth(CFX_PtrArray& p);
-  static int32_t getMinCodewordWidth(CFX_PtrArray& p);
+  static int32_t getMaxCodewordWidth(
+      const CFX_ArrayTemplate<CBC_ResultPoint*>& p);
+  static int32_t getMinCodewordWidth(
+      const CFX_ArrayTemplate<CBC_ResultPoint*>& p);
 };
 
 #endif  // XFA_FXBARCODE_PDF417_BC_PDF417READER_H_
diff --git a/xfa/fxbarcode/pdf417/BC_PDF417ScanningDecoder.cpp b/xfa/fxbarcode/pdf417/BC_PDF417ScanningDecoder.cpp
index e0eaf3e..4c3d4db 100644
--- a/xfa/fxbarcode/pdf417/BC_PDF417ScanningDecoder.cpp
+++ b/xfa/fxbarcode/pdf417/BC_PDF417ScanningDecoder.cpp
@@ -20,6 +20,8 @@
  * limitations under the License.
  */
 
+#include <memory>
+
 #include "xfa/fxbarcode/BC_DecoderResult.h"
 #include "xfa/fxbarcode/BC_ResultPoint.h"
 #include "xfa/fxbarcode/common/BC_CommonBitMatrix.h"
@@ -155,16 +157,14 @@
   }
   return decoderresult;
 }
+
 CFX_ByteString CBC_PDF417ScanningDecoder::toString(
-    CFX_PtrArray* barcodeMatrix) {
+    CBC_BarcodeValueArrayArray* barcodeMatrix) {
   CFX_ByteString result;
   for (int32_t row = 0; row < barcodeMatrix->GetSize(); row++) {
     result += row;
-    int32_t l = 0;
-    for (; l < ((CFX_PtrArray*)barcodeMatrix->GetAt(row))->GetSize(); l++) {
-      CBC_BarcodeValue* barcodeValue =
-          (CBC_BarcodeValue*)((CFX_PtrArray*)barcodeMatrix->GetAt(row))
-              ->GetAt(l);
+    for (int32_t l = 0; l < barcodeMatrix->GetAt(row)->GetSize(); l++) {
+      CBC_BarcodeValue* barcodeValue = barcodeMatrix->GetAt(row)->GetAt(l);
       if (barcodeValue->getValue()->GetSize() == 0) {
         result += "";
       } else {
@@ -176,6 +176,7 @@
   }
   return result;
 }
+
 CBC_DetectionResult* CBC_PDF417ScanningDecoder::merge(
     CBC_DetectionResultRowIndicatorColumn* leftRowIndicatorColumn,
     CBC_DetectionResultRowIndicatorColumn* rightRowIndicatorColumn,
@@ -323,13 +324,13 @@
   }
   return rowIndicatorColumn;
 }
+
 void CBC_PDF417ScanningDecoder::adjustCodewordCount(
     CBC_DetectionResult* detectionResult,
-    CFX_PtrArray* barcodeMatrix,
+    CBC_BarcodeValueArrayArray* barcodeMatrix,
     int32_t& e) {
-  CFX_Int32Array* numberOfCodewords =
-      ((CBC_BarcodeValue*)((CFX_PtrArray*)barcodeMatrix->GetAt(0))->GetAt(1))
-          ->getValue();
+  std::unique_ptr<CFX_Int32Array> numberOfCodewords(
+      barcodeMatrix->GetAt(0)->GetAt(1)->getValue());
   int32_t calculatedNumberOfCodewords =
       detectionResult->getBarcodeColumnCount() *
           detectionResult->getBarcodeRowCount() -
@@ -339,47 +340,39 @@
         calculatedNumberOfCodewords >
             CBC_PDF417Common::MAX_CODEWORDS_IN_BARCODE) {
       e = BCExceptiontNotFoundInstance;
-      delete numberOfCodewords;
       BC_EXCEPTION_CHECK_ReturnVoid(e);
     }
-    ((CBC_BarcodeValue*)((CFX_PtrArray*)barcodeMatrix->GetAt(0))->GetAt(1))
-        ->setValue(calculatedNumberOfCodewords);
+    barcodeMatrix->GetAt(0)->GetAt(1)->setValue(calculatedNumberOfCodewords);
   } else if (numberOfCodewords->GetAt(0) != calculatedNumberOfCodewords) {
-    ((CBC_BarcodeValue*)((CFX_PtrArray*)barcodeMatrix->GetAt(0))->GetAt(1))
-        ->setValue(calculatedNumberOfCodewords);
+    barcodeMatrix->GetAt(0)->GetAt(1)->setValue(calculatedNumberOfCodewords);
   }
-  delete numberOfCodewords;
 }
+
 CBC_CommonDecoderResult* CBC_PDF417ScanningDecoder::createDecoderResult(
     CBC_DetectionResult* detectionResult,
     int32_t& e) {
-  CFX_PtrArray* barcodeMatrix = createBarcodeMatrix(detectionResult);
-  adjustCodewordCount(detectionResult, barcodeMatrix, e);
+  std::unique_ptr<CBC_BarcodeValueArrayArray> barcodeMatrix(
+      createBarcodeMatrix(detectionResult));
+  adjustCodewordCount(detectionResult, barcodeMatrix.get(), e);
   if (e != BCExceptionNO) {
     for (int32_t i = 0; i < barcodeMatrix->GetSize(); i++) {
-      CFX_PtrArray* temp = (CFX_PtrArray*)barcodeMatrix->GetAt(i);
-      for (int32_t j = 0; j < temp->GetSize(); j++) {
-        delete (CBC_BarcodeValue*)temp->GetAt(j);
-      }
-      temp->RemoveAll();
+      CBC_BarcodeValueArray* temp = barcodeMatrix->GetAt(i);
+      for (int32_t j = 0; j < temp->GetSize(); j++)
+        delete temp->GetAt(j);
       delete temp;
     }
-    barcodeMatrix->RemoveAll();
-    delete barcodeMatrix;
-    return NULL;
+    return nullptr;
   }
   CFX_Int32Array erasures;
   CFX_Int32Array codewords;
   codewords.SetSize(detectionResult->getBarcodeRowCount() *
                     detectionResult->getBarcodeColumnCount());
-  CFX_PtrArray ambiguousIndexValuesList;
+  CFX_ArrayTemplate<CFX_Int32Array*> ambiguousIndexValuesList;
   CFX_Int32Array ambiguousIndexesList;
   for (int32_t row = 0; row < detectionResult->getBarcodeRowCount(); row++) {
     for (int32_t l = 0; l < detectionResult->getBarcodeColumnCount(); l++) {
       CFX_Int32Array* values =
-          ((CBC_BarcodeValue*)((CFX_PtrArray*)barcodeMatrix->GetAt(row))
-               ->GetAt(l + 1))
-              ->getValue();
+          barcodeMatrix->GetAt(row)->GetAt(l + 1)->getValue();
       int32_t codewordIndex =
           row * detectionResult->getBarcodeColumnCount() + l;
       if (values->GetSize() == 0) {
@@ -392,35 +385,33 @@
       }
     }
   }
-  CFX_PtrArray ambiguousIndexValues;
+  CFX_ArrayTemplate<CFX_Int32Array*> ambiguousIndexValues;
   ambiguousIndexValues.SetSize(ambiguousIndexValuesList.GetSize());
   for (int32_t i = 0; i < ambiguousIndexValues.GetSize(); i++) {
     ambiguousIndexValues.SetAt(i, ambiguousIndexValuesList.GetAt(i));
   }
   for (int32_t l = 0; l < barcodeMatrix->GetSize(); l++) {
-    CFX_PtrArray* temp = (CFX_PtrArray*)barcodeMatrix->GetAt(l);
-    for (int32_t j = 0; j < temp->GetSize(); j++) {
-      delete (CBC_BarcodeValue*)temp->GetAt(j);
-    }
+    CBC_BarcodeValueArray* temp = barcodeMatrix->GetAt(l);
+    for (int32_t j = 0; j < temp->GetSize(); j++)
+      delete temp->GetAt(j);
     temp->RemoveAll();
     delete temp;
   }
-  barcodeMatrix->RemoveAll();
-  delete barcodeMatrix;
   CBC_CommonDecoderResult* decoderResult =
       createDecoderResultFromAmbiguousValues(
           detectionResult->getBarcodeECLevel(), codewords, erasures,
           ambiguousIndexesList, ambiguousIndexValues, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
+  BC_EXCEPTION_CHECK_ReturnValue(e, nullptr);
   return decoderResult;
 }
+
 CBC_CommonDecoderResult*
 CBC_PDF417ScanningDecoder::createDecoderResultFromAmbiguousValues(
     int32_t ecLevel,
     CFX_Int32Array& codewords,
     CFX_Int32Array& erasureArray,
     CFX_Int32Array& ambiguousIndexes,
-    CFX_PtrArray& ambiguousIndexValues,
+    CFX_ArrayTemplate<CFX_Int32Array*>& ambiguousIndexValues,
     int32_t& e) {
   CFX_Int32Array ambiguousIndexCount;
   ambiguousIndexCount.SetSize(ambiguousIndexes.GetSize());
@@ -428,8 +419,7 @@
   while (tries-- > 0) {
     for (int32_t l = 0; l < ambiguousIndexCount.GetSize(); l++) {
       codewords[ambiguousIndexes[l]] =
-          ((CFX_Int32Array*)ambiguousIndexValues.GetAt(l))
-              ->GetAt(ambiguousIndexCount[l]);
+          ambiguousIndexValues.GetAt(l)->GetAt(ambiguousIndexCount[l]);
     }
     CBC_CommonDecoderResult* decoderResult =
         decodeCodewords(codewords, ecLevel, erasureArray, e);
@@ -445,7 +435,7 @@
     }
     for (int32_t i = 0; i < ambiguousIndexCount.GetSize(); i++) {
       if (ambiguousIndexCount[i] <
-          ((CFX_Int32Array*)(ambiguousIndexValues.GetAt(i)))->GetSize() - 1) {
+          ambiguousIndexValues.GetAt(i)->GetSize() - 1) {
         ambiguousIndexCount[i]++;
         break;
       } else {
@@ -460,28 +450,24 @@
   e = BCExceptionChecksumInstance;
   return NULL;
 }
-CFX_PtrArray* CBC_PDF417ScanningDecoder::createBarcodeMatrix(
+CBC_BarcodeValueArrayArray* CBC_PDF417ScanningDecoder::createBarcodeMatrix(
     CBC_DetectionResult* detectionResult) {
-  CFX_PtrArray* barcodeMatrix = new CFX_PtrArray;
+  CBC_BarcodeValueArrayArray* barcodeMatrix = new CBC_BarcodeValueArrayArray;
   barcodeMatrix->SetSize(detectionResult->getBarcodeRowCount());
-  CFX_PtrArray* temp = NULL;
-  int32_t colume = 0;
   for (int32_t row = 0; row < barcodeMatrix->GetSize(); row++) {
-    temp = new CFX_PtrArray;
+    CBC_BarcodeValueArray* temp = new CBC_BarcodeValueArray;
     temp->SetSize(detectionResult->getBarcodeColumnCount() + 2);
-    for (colume = 0; colume < detectionResult->getBarcodeColumnCount() + 2;
-         colume++) {
-      temp->SetAt(colume, new CBC_BarcodeValue());
+    for (int32_t column = 0;
+         column < detectionResult->getBarcodeColumnCount() + 2; column++) {
+      temp->SetAt(column, new CBC_BarcodeValue());
     }
     barcodeMatrix->SetAt(row, temp);
   }
-  colume = -1;
   for (int32_t i = 0;
        i < detectionResult->getDetectionResultColumns().GetSize(); i++) {
     CBC_DetectionResultColumn* detectionResultColumn =
         (CBC_DetectionResultColumn*)detectionResult->getDetectionResultColumns()
             .GetAt(i);
-    colume++;
     if (detectionResultColumn == NULL) {
       continue;
     }
@@ -492,9 +478,8 @@
       if (codeword == NULL || codeword->getRowNumber() == -1) {
         continue;
       }
-      ((CBC_BarcodeValue*)((CFX_PtrArray*)barcodeMatrix->GetAt(
-                               codeword->getRowNumber()))
-           ->GetAt(colume))
+      barcodeMatrix->GetAt(codeword->getRowNumber())
+          ->GetAt(i)
           ->setValue(codeword->getValue());
     }
   }
diff --git a/xfa/fxbarcode/pdf417/BC_PDF417ScanningDecoder.h b/xfa/fxbarcode/pdf417/BC_PDF417ScanningDecoder.h
index 6dbc125..aa99d5a 100644
--- a/xfa/fxbarcode/pdf417/BC_PDF417ScanningDecoder.h
+++ b/xfa/fxbarcode/pdf417/BC_PDF417ScanningDecoder.h
@@ -7,6 +7,8 @@
 #ifndef XFA_FXBARCODE_PDF417_BC_PDF417SCANNINGDECODER_H_
 #define XFA_FXBARCODE_PDF417_BC_PDF417SCANNINGDECODER_H_
 
+#include "xfa/fxbarcode/pdf417/BC_PDF417BarcodeValue.h"
+
 class CBC_CommonDecoderResult;
 class CBC_CommonBitMatrix;
 class CBC_Codeword;
@@ -30,7 +32,7 @@
                                          int32_t minCodewordWidth,
                                          int32_t maxCodewordWidth,
                                          int32_t& e);
-  static CFX_ByteString toString(CFX_PtrArray* barcodeMatrix);
+  static CFX_ByteString toString(CBC_BarcodeValueArrayArray* barcodeMatrix);
 
  private:
   static int32_t CODEWORD_SKEW_SIZE;
@@ -56,7 +58,7 @@
       int32_t minCodewordWidth,
       int32_t maxCodewordWidth);
   static void adjustCodewordCount(CBC_DetectionResult* detectionResult,
-                                  CFX_PtrArray* barcodeMatrix,
+                                  CBC_BarcodeValueArrayArray* barcodeMatrix,
                                   int32_t& e);
   static CBC_CommonDecoderResult* createDecoderResult(
       CBC_DetectionResult* detectionResult,
@@ -66,9 +68,9 @@
       CFX_Int32Array& codewords,
       CFX_Int32Array& erasureArray,
       CFX_Int32Array& ambiguousIndexes,
-      CFX_PtrArray& ambiguousIndexValues,
+      CFX_ArrayTemplate<CFX_Int32Array*>& ambiguousIndexValues,
       int32_t& e);
-  static CFX_PtrArray* createBarcodeMatrix(
+  static CBC_BarcodeValueArrayArray* createBarcodeMatrix(
       CBC_DetectionResult* detectionResult);
   static FX_BOOL isValidBarcodeColumn(CBC_DetectionResult* detectionResult,
                                       int32_t barcodeColumn);
diff --git a/xfa/fxbarcode/qrcode/BC_QRCoderEncoder.cpp b/xfa/fxbarcode/qrcode/BC_QRCoderEncoder.cpp
index ded0df6..eb76426 100644
--- a/xfa/fxbarcode/qrcode/BC_QRCoderEncoder.cpp
+++ b/xfa/fxbarcode/qrcode/BC_QRCoderEncoder.cpp
@@ -88,7 +88,7 @@
 }
 void CBC_QRCoderEncoder::AppendECI(CBC_QRCoderBitVector* bits) {}
 void CBC_QRCoderEncoder::AppendDataModeLenghInfo(
-    CFX_PtrArray& splitResult,
+    const CFX_ArrayTemplate<Make_Pair*>& splitResult,
     CBC_QRCoderBitVector& headerAndDataBits,
     CBC_QRCoderMode* tempMode,
     CBC_QRCoder* qrCode,
@@ -141,7 +141,7 @@
   }
 }
 void CBC_QRCoderEncoder::SplitString(const CFX_ByteString& content,
-                                     CFX_PtrArray& result) {
+                                     CFX_ArrayTemplate<Make_Pair*>* result) {
   int32_t index = 0, flag = 0;
   while (
       (((uint8_t)content[index] >= 0xA1 && (uint8_t)content[index] <= 0xAA) ||
@@ -150,7 +150,7 @@
     index += 2;
   }
   if (index != flag) {
-    result.Add(
+    result->Add(
         new Make_Pair(CBC_QRCoderMode::sGBK, content.Mid(flag, index - flag)));
   }
   flag = index;
@@ -174,7 +174,7 @@
     }
   }
   if (index != flag) {
-    result.Add(
+    result->Add(
         new Make_Pair(CBC_QRCoderMode::sBYTE, content.Mid(flag, index - flag)));
   }
   flag = index;
@@ -186,8 +186,8 @@
     index++;
   }
   if (index != flag) {
-    result.Add(new Make_Pair(CBC_QRCoderMode::sNUMERIC,
-                             content.Mid(flag, index - flag)));
+    result->Add(new Make_Pair(CBC_QRCoderMode::sNUMERIC,
+                              content.Mid(flag, index - flag)));
   }
   flag = index;
   if (index >= content.GetLength()) {
@@ -198,15 +198,14 @@
     index++;
   }
   if (index != flag) {
-    result.Add(new Make_Pair(CBC_QRCoderMode::sALPHANUMERIC,
-                             content.Mid(flag, index - flag)));
+    result->Add(new Make_Pair(CBC_QRCoderMode::sALPHANUMERIC,
+                              content.Mid(flag, index - flag)));
   }
   flag = index;
-  if (index >= content.GetLength()) {
-    return;
-  }
-  SplitString(content.Mid(index, content.GetLength() - index), result);
+  if (index < content.GetLength())
+    SplitString(content.Mid(index, content.GetLength() - index), result);
 }
+
 int32_t CBC_QRCoderEncoder::GetSpanByVersion(CBC_QRCoderMode* modeFirst,
                                              CBC_QRCoderMode* modeSecond,
                                              int32_t versionNum,
@@ -253,16 +252,17 @@
   }
   return -1;
 }
-void CBC_QRCoderEncoder::MergeString(CFX_PtrArray& result,
+
+void CBC_QRCoderEncoder::MergeString(CFX_ArrayTemplate<Make_Pair*>* result,
                                      int32_t versionNum,
                                      int32_t& e) {
   Make_Pair* first = NULL;
   Make_Pair* second = NULL;
   size_t mergeNum = 0;
   int32_t i;
-  for (i = 0; ((i < result.GetSize()) && (i + 1 < result.GetSize())); i++) {
-    first = (Make_Pair*)result[i];
-    second = (Make_Pair*)result[i + 1];
+  for (i = 0; ((i < result->GetSize()) && (i + 1 < result->GetSize())); i++) {
+    first = (*result)[i];
+    second = (*result)[i + 1];
     if (first->m_mode == CBC_QRCoderMode::sALPHANUMERIC) {
       int32_t tmp = GetSpanByVersion(CBC_QRCoderMode::sALPHANUMERIC,
                                      CBC_QRCoderMode::sBYTE, versionNum, e);
@@ -272,7 +272,7 @@
         CFX_ByteString str = first->m_string + second->m_string;
         second->m_string = str;
         delete first;
-        result.RemoveAt(i);
+        result->RemoveAt(i);
         i--;
         mergeNum++;
       }
@@ -280,7 +280,7 @@
       if (second->m_mode == CBC_QRCoderMode::sBYTE) {
         first->m_string += second->m_string;
         delete second;
-        result.RemoveAt(i + 1);
+        result->RemoveAt(i + 1);
         i--;
         mergeNum++;
       }
@@ -293,7 +293,7 @@
         CFX_ByteString str = first->m_string + second->m_string;
         second->m_string = str;
         delete first;
-        result.RemoveAt(i);
+        result->RemoveAt(i);
         i--;
         mergeNum++;
       }
@@ -305,7 +305,7 @@
         CFX_ByteString str = first->m_string + second->m_string;
         second->m_string = str;
         delete first;
-        result.RemoveAt(i);
+        result->RemoveAt(i);
         i--;
         mergeNum++;
       }
@@ -353,20 +353,18 @@
     int32_t& e) {
   CFX_ByteString encoding = "utf8";
   CBC_QRCoderMode* mode = CBC_QRCoderMode::sBYTE;
-  CFX_PtrArray splitResult;
+  CFX_ArrayTemplate<Make_Pair*> splitResult;
   CBC_QRCoderBitVector dataBits;
   dataBits.Init();
-  SplitString(content, splitResult);
-  MergeString(splitResult, versionSpecify, e);
+  SplitString(content, &splitResult);
+  MergeString(&splitResult, versionSpecify, e);
   BC_EXCEPTION_CHECK_ReturnVoid(e) CBC_QRCoderMode* tempMode = NULL;
   for (int32_t i = 0; i < splitResult.GetSize(); i++) {
-    AppendBytes(((Make_Pair*)splitResult[i])->m_string,
-                ((Make_Pair*)splitResult[i])->m_mode, &dataBits, encoding, e);
+    AppendBytes(splitResult[i]->m_string, splitResult[i]->m_mode, &dataBits,
+                encoding, e);
     if (e != BCExceptionNO) {
-      for (int32_t y = 0; y < splitResult.GetSize(); y++) {
-        delete (Make_Pair*)splitResult[y];
-      }
-      splitResult.RemoveAll();
+      for (int32_t y = 0; y < splitResult.GetSize(); y++)
+        delete splitResult[y];
       return;
     }
   }
@@ -375,34 +373,25 @@
   headerAndDataBits.Init();
   InitQRCode(numInputBytes, versionSpecify, ecLevel, mode, qrCode, e);
   if (e != BCExceptionNO) {
-    for (int32_t k = 0; k < splitResult.GetSize(); k++) {
-      delete (Make_Pair*)splitResult[k];
-    }
-    splitResult.RemoveAll();
+    for (int32_t k = 0; k < splitResult.GetSize(); k++)
+      delete splitResult[k];
     return;
   }
   AppendDataModeLenghInfo(splitResult, headerAndDataBits, tempMode, qrCode,
                           encoding, e);
   if (e != BCExceptionNO) {
-    for (int32_t k = 0; k < splitResult.GetSize(); k++) {
-      delete (Make_Pair*)splitResult[k];
-    }
-    splitResult.RemoveAll();
+    for (int32_t k = 0; k < splitResult.GetSize(); k++)
+      delete splitResult[k];
     return;
   }
   numInputBytes = headerAndDataBits.sizeInBytes();
   TerminateBits(qrCode->GetNumDataBytes(), &headerAndDataBits, e);
-  if (e != BCExceptionNO) {
-    for (int32_t k = 0; k < splitResult.GetSize(); k++) {
-      delete (Make_Pair*)splitResult[k];
-    }
-    splitResult.RemoveAll();
-    return;
-  }
   for (int32_t j = 0; j < splitResult.GetSize(); j++) {
-    delete (Make_Pair*)splitResult[j];
+    delete splitResult[j];
   }
-  splitResult.RemoveAll();
+  if (e != BCExceptionNO)
+    return;
+
   CBC_QRCoderBitVector finalBits;
   finalBits.Init();
   InterleaveWithECBytes(&headerAndDataBits, qrCode->GetNumTotalBytes(),
@@ -433,21 +422,19 @@
     int32_t& e) {
   CFX_ByteString encoding = "utf8";
   CBC_QRCoderMode* mode = CBC_QRCoderMode::sBYTE;
-  CFX_PtrArray splitResult;
+  CFX_ArrayTemplate<Make_Pair*> splitResult;
   CBC_QRCoderBitVector dataBits;
   dataBits.Init();
-  SplitString(content, splitResult);
-  MergeString(splitResult, 8, e);
+  SplitString(content, &splitResult);
+  MergeString(&splitResult, 8, e);
   BC_EXCEPTION_CHECK_ReturnVoid(e);
   CBC_QRCoderMode* tempMode = NULL;
   for (int32_t i = 0; i < splitResult.GetSize(); i++) {
-    AppendBytes(((Make_Pair*)splitResult[i])->m_string,
-                ((Make_Pair*)splitResult[i])->m_mode, &dataBits, encoding, e);
+    AppendBytes(splitResult[i]->m_string, splitResult[i]->m_mode, &dataBits,
+                encoding, e);
     if (e != BCExceptionNO) {
-      for (int32_t l = 0; l < splitResult.GetSize(); l++) {
-        delete (Make_Pair*)splitResult[l];
-      }
-      splitResult.RemoveAll();
+      for (int32_t l = 0; l < splitResult.GetSize(); l++)
+        delete splitResult[l];
       return;
     }
   }
@@ -482,17 +469,14 @@
       e = BCExceptionNO;
       goto sign;
     } else {
-      for (int32_t j = 0; j < splitResult.GetSize(); j++) {
-        delete (Make_Pair*)splitResult[j];
-      }
-      splitResult.RemoveAll();
+      for (int32_t j = 0; j < splitResult.GetSize(); j++)
+        delete splitResult[j];
       return;
     }
   }
-  for (int32_t k = 0; k < splitResult.GetSize(); k++) {
-    delete (Make_Pair*)splitResult[k];
-  }
-  splitResult.RemoveAll();
+  for (int32_t k = 0; k < splitResult.GetSize(); k++)
+    delete splitResult[k];
+
   CBC_QRCoderBitVector finalBits;
   finalBits.Init();
   InterleaveWithECBytes(&headerAndDataBits, qrCode->GetNumTotalBytes(),
@@ -863,7 +847,7 @@
   int32_t dataBytesOffset = 0;
   int32_t maxNumDataBytes = 0;
   int32_t maxNumEcBytes = 0;
-  CFX_PtrArray blocks;
+  CFX_ArrayTemplate<CBC_QRCoderBlockPair*> blocks;
   int32_t i;
   for (i = 0; i < numRSBlocks; i++) {
     int32_t numDataBytesInBlock;
@@ -887,8 +871,7 @@
   }
   for (int32_t x = 0; x < maxNumDataBytes; x++) {
     for (int32_t j = 0; j < blocks.GetSize(); j++) {
-      CBC_CommonByteArray* dataBytes =
-          ((CBC_QRCoderBlockPair*)blocks[j])->GetDataBytes();
+      CBC_CommonByteArray* dataBytes = blocks[j]->GetDataBytes();
       if (x < dataBytes->Size()) {
         result->AppendBits(dataBytes->At(x), 8, e);
         BC_EXCEPTION_CHECK_ReturnVoid(e);
@@ -897,8 +880,7 @@
   }
   for (int32_t y = 0; y < maxNumEcBytes; y++) {
     for (int32_t l = 0; l < blocks.GetSize(); l++) {
-      CBC_CommonByteArray* ecBytes =
-          ((CBC_QRCoderBlockPair*)blocks[l])->GetErrorCorrectionBytes();
+      CBC_CommonByteArray* ecBytes = blocks[l]->GetErrorCorrectionBytes();
       if (y < ecBytes->Size()) {
         result->AppendBits(ecBytes->At(y), 8, e);
         BC_EXCEPTION_CHECK_ReturnVoid(e);
@@ -906,7 +888,7 @@
     }
   }
   for (int32_t k = 0; k < blocks.GetSize(); k++) {
-    delete (CBC_QRCoderBlockPair*)blocks[k];
+    delete blocks[k];
   }
   if (numTotalBytes != result->sizeInBytes()) {
     e = BCExceptionSizeInBytesDiffer;
diff --git a/xfa/fxbarcode/qrcode/BC_QRCoderEncoder.h b/xfa/fxbarcode/qrcode/BC_QRCoderEncoder.h
index bbdec5b..be0a76c 100644
--- a/xfa/fxbarcode/qrcode/BC_QRCoderEncoder.h
+++ b/xfa/fxbarcode/qrcode/BC_QRCoderEncoder.h
@@ -16,6 +16,7 @@
 class CBC_QRCoderBitVector;
 class CBC_CommonByteArray;
 class CBC_CommonByteMatrix;
+class Make_Pair;
 
 class CBC_QRCoderEncoder {
  private:
@@ -120,14 +121,18 @@
                                   CBC_QRCoderMode* modeSecond,
                                   int32_t versionNum,
                                   int32_t& e);
-  static void MergeString(CFX_PtrArray& result, int32_t versionNum, int32_t& e);
-  static void SplitString(const CFX_ByteString& content, CFX_PtrArray& result);
-  static void AppendDataModeLenghInfo(CFX_PtrArray& splitResult,
-                                      CBC_QRCoderBitVector& headerAndDataBits,
-                                      CBC_QRCoderMode* tempMode,
-                                      CBC_QRCoder* qrCode,
-                                      CFX_ByteString& encoding,
-                                      int32_t& e);
+  static void MergeString(CFX_ArrayTemplate<Make_Pair*>* result,
+                          int32_t versionNum,
+                          int32_t& e);
+  static void SplitString(const CFX_ByteString& content,
+                          CFX_ArrayTemplate<Make_Pair*>* result);
+  static void AppendDataModeLenghInfo(
+      const CFX_ArrayTemplate<Make_Pair*>& splitResult,
+      CBC_QRCoderBitVector& headerAndDataBits,
+      CBC_QRCoderMode* tempMode,
+      CBC_QRCoder* qrCode,
+      CFX_ByteString& encoding,
+      int32_t& e);
 };
 
 #endif  // XFA_FXBARCODE_QRCODE_BC_QRCODERENCODER_H_
diff --git a/xfa/fxbarcode/qrcode/BC_QRCoderVersion.cpp b/xfa/fxbarcode/qrcode/BC_QRCoderVersion.cpp
index e922678..9c3a1cc 100644
--- a/xfa/fxbarcode/qrcode/BC_QRCoderVersion.cpp
+++ b/xfa/fxbarcode/qrcode/BC_QRCoderVersion.cpp
@@ -35,17 +35,18 @@
     0x15683, 0x168C9, 0x177EC, 0x18EC4, 0x191E1, 0x1AFAB, 0x1B08E,
     0x1CC1A, 0x1D33F, 0x1ED75, 0x1F250, 0x209D5, 0x216F0, 0x228BA,
     0x2379F, 0x24B0B, 0x2542E, 0x26A64, 0x27541, 0x28C69};
-CFX_PtrArray* CBC_QRCoderVersion::VERSION = NULL;
+
+CFX_ArrayTemplate<CBC_QRCoderVersion*>* CBC_QRCoderVersion::VERSION = nullptr;
 
 void CBC_QRCoderVersion::Initialize() {
-  VERSION = new CFX_PtrArray();
+  VERSION = new CFX_ArrayTemplate<CBC_QRCoderVersion*>();
 }
 void CBC_QRCoderVersion::Finalize() {
-  for (int32_t i = 0; i < VERSION->GetSize(); i++) {
-    CBC_QRCoderVersion* v = (CBC_QRCoderVersion*)(VERSION->GetAt(i));
-    delete v;
-  }
+  for (int32_t i = 0; i < VERSION->GetSize(); i++)
+    delete VERSION->GetAt(i);
+
   delete VERSION;
+  VERSION = nullptr;
 }
 CBC_QRCoderVersion::CBC_QRCoderVersion(int32_t versionNumber,
                                        CBC_QRCoderECBlocks* ecBlocks1,
@@ -755,11 +756,11 @@
     e = BCExceptionIllegalArgument;
     BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
   }
-  return (CBC_QRCoderVersion*)(*VERSION)[versionNumber - 1];
+  return (*VERSION)[versionNumber - 1];
 }
+
 void CBC_QRCoderVersion::Destroy() {
-  int32_t i;
-  for (i = 0; i < VERSION->GetSize(); i++) {
-    delete ((CBC_QRCoderVersion*)(*VERSION)[i]);
-  }
+  for (int32_t i = 0; i < VERSION->GetSize(); i++)
+    delete (*VERSION)[i];
+  VERSION->RemoveAll();
 }
diff --git a/xfa/fxbarcode/qrcode/BC_QRCoderVersion.h b/xfa/fxbarcode/qrcode/BC_QRCoderVersion.h
index 05bd719..deae893 100644
--- a/xfa/fxbarcode/qrcode/BC_QRCoderVersion.h
+++ b/xfa/fxbarcode/qrcode/BC_QRCoderVersion.h
@@ -44,7 +44,7 @@
                      CBC_QRCoderECBlocks* ecBlocks4);
 
   static const int32_t VERSION_DECODE_INFO[34];
-  static CFX_PtrArray* VERSION;
+  static CFX_ArrayTemplate<CBC_QRCoderVersion*>* VERSION;
 
   int32_t m_versionNumber;
   int32_t m_totalCodeWords;
