Clean up C-Style casts in CBC_CodeBase and subclasses

Make the parent class own the reader/writer via unique_ptrs.
De-virtualize some methods with no overrides.

Review-Url: https://codereview.chromium.org/2037573005
diff --git a/xfa/fxbarcode/cbc_codabar.cpp b/xfa/fxbarcode/cbc_codabar.cpp
index 23cd2d1..4ed63ba 100644
--- a/xfa/fxbarcode/cbc_codabar.cpp
+++ b/xfa/fxbarcode/cbc_codabar.cpp
@@ -27,35 +27,34 @@
 #include "xfa/fxbarcode/oned/BC_OnedCodaBarReader.h"
 #include "xfa/fxbarcode/oned/BC_OnedCodaBarWriter.h"
 
-CBC_Codabar::CBC_Codabar() {
-  m_pBCReader = (CBC_Reader*)new (CBC_OnedCodaBarReader);
-  m_pBCWriter = (CBC_Writer*)new (CBC_OnedCodaBarWriter);
-}
+CBC_Codabar::CBC_Codabar()
+    : CBC_OneCode(new CBC_OnedCodaBarReader, new CBC_OnedCodaBarWriter) {}
 
-CBC_Codabar::~CBC_Codabar() {
-  delete (m_pBCReader);
-  delete (m_pBCWriter);
-}
+CBC_Codabar::~CBC_Codabar() {}
 
 FX_BOOL CBC_Codabar::SetStartChar(FX_CHAR start) {
-  if (m_pBCWriter)
-    return ((CBC_OnedCodaBarWriter*)m_pBCWriter)->SetStartChar(start);
-  return FALSE;
+  if (!m_pBCWriter)
+    return FALSE;
+  return static_cast<CBC_OnedCodaBarWriter*>(m_pBCWriter.get())
+      ->SetStartChar(start);
 }
 
 FX_BOOL CBC_Codabar::SetEndChar(FX_CHAR end) {
   if (m_pBCWriter)
-    return ((CBC_OnedCodaBarWriter*)m_pBCWriter)->SetEndChar(end);
+    return static_cast<CBC_OnedCodaBarWriter*>(m_pBCWriter.get())
+        ->SetEndChar(end);
   return FALSE;
 }
 
 FX_BOOL CBC_Codabar::SetTextLocation(BC_TEXT_LOC location) {
-  return ((CBC_OnedCodaBarWriter*)m_pBCWriter)->SetTextLocation(location);
+  return static_cast<CBC_OnedCodaBarWriter*>(m_pBCWriter.get())
+      ->SetTextLocation(location);
 }
 
 FX_BOOL CBC_Codabar::SetWideNarrowRatio(int32_t ratio) {
   if (m_pBCWriter)
-    return ((CBC_OnedCodaBarWriter*)m_pBCWriter)->SetWideNarrowRatio(ratio);
+    return static_cast<CBC_OnedCodaBarWriter*>(m_pBCWriter.get())
+        ->SetWideNarrowRatio(ratio);
   return FALSE;
 }
 
@@ -70,13 +69,14 @@
   int32_t outWidth = 0;
   int32_t outHeight = 0;
   CFX_WideString filtercontents =
-      ((CBC_OneDimWriter*)m_pBCWriter)->FilterContents(contents);
+      static_cast<CBC_OneDimWriter*>(m_pBCWriter.get())
+          ->FilterContents(contents);
   CFX_ByteString byteString = filtercontents.UTF8Encode();
   m_renderContents = filtercontents;
-  uint8_t* data = static_cast<CBC_OnedCodaBarWriter*>(m_pBCWriter)
+  uint8_t* data = static_cast<CBC_OnedCodaBarWriter*>(m_pBCWriter.get())
                       ->Encode(byteString, format, outWidth, outHeight, e);
   BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
-  ((CBC_OneDimWriter*)m_pBCWriter)
+  static_cast<CBC_OneDimWriter*>(m_pBCWriter.get())
       ->RenderResult(filtercontents.AsStringC(), data, outWidth, isDevice, e);
   FX_Free(data);
   BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
@@ -87,9 +87,9 @@
                                   const CFX_Matrix* matrix,
                                   int32_t& e) {
   CFX_WideString renderCon =
-      ((CBC_OnedCodaBarWriter*)m_pBCWriter)
+      static_cast<CBC_OnedCodaBarWriter*>(m_pBCWriter.get())
           ->encodedContents(m_renderContents.AsStringC());
-  ((CBC_OneDimWriter*)m_pBCWriter)
+  static_cast<CBC_OneDimWriter*>(m_pBCWriter.get())
       ->RenderDeviceResult(device, matrix, renderCon.AsStringC(), e);
   BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
   return TRUE;
@@ -97,9 +97,9 @@
 
 FX_BOOL CBC_Codabar::RenderBitmap(CFX_DIBitmap*& pOutBitmap, int32_t& e) {
   CFX_WideString renderCon =
-      ((CBC_OnedCodaBarWriter*)m_pBCWriter)
+      static_cast<CBC_OnedCodaBarWriter*>(m_pBCWriter.get())
           ->encodedContents(m_renderContents.AsStringC());
-  ((CBC_OneDimWriter*)m_pBCWriter)
+  static_cast<CBC_OneDimWriter*>(m_pBCWriter.get())
       ->RenderBitmapResult(pOutBitmap, renderCon.AsStringC(), e);
   BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
   return TRUE;
diff --git a/xfa/fxbarcode/cbc_code128.cpp b/xfa/fxbarcode/cbc_code128.cpp
index 85d7afb..c3614be 100644
--- a/xfa/fxbarcode/cbc_code128.cpp
+++ b/xfa/fxbarcode/cbc_code128.cpp
@@ -27,19 +27,15 @@
 #include "xfa/fxbarcode/oned/BC_OnedCode128Reader.h"
 #include "xfa/fxbarcode/oned/BC_OnedCode128Writer.h"
 
-CBC_Code128::CBC_Code128(BC_TYPE type) {
-  m_pBCReader = (CBC_Reader*)new (CBC_OnedCode128Reader);
-  m_pBCWriter = (CBC_Writer*)new CBC_OnedCode128Writer(type);
-}
+CBC_Code128::CBC_Code128(BC_TYPE type)
+    : CBC_OneCode(new CBC_OnedCode128Reader, new CBC_OnedCode128Writer(type)) {}
 
-CBC_Code128::~CBC_Code128() {
-  delete (m_pBCReader);
-  delete (m_pBCWriter);
-}
+CBC_Code128::~CBC_Code128() {}
 
 FX_BOOL CBC_Code128::SetTextLocation(BC_TEXT_LOC location) {
   if (m_pBCWriter)
-    return ((CBC_OnedCode128Writer*)m_pBCWriter)->SetTextLocation(location);
+    return static_cast<CBC_OnedCode128Writer*>(m_pBCWriter.get())
+        ->SetTextLocation(location);
   return FALSE;
 }
 
@@ -55,17 +51,19 @@
   int32_t outHeight = 0;
   CFX_WideString content(contents);
   if (contents.GetLength() % 2 &&
-      ((CBC_OnedCode128Writer*)m_pBCWriter)->GetType() == BC_CODE128_C) {
+      static_cast<CBC_OnedCode128Writer*>(m_pBCWriter.get())->GetType() ==
+          BC_CODE128_C) {
     content += '0';
   }
-  CFX_WideString encodeContents = ((CBC_OnedCode128Writer*)m_pBCWriter)
-                                      ->FilterContents(content.AsStringC());
+  CFX_WideString encodeContents =
+      static_cast<CBC_OnedCode128Writer*>(m_pBCWriter.get())
+          ->FilterContents(content.AsStringC());
   m_renderContents = encodeContents;
   CFX_ByteString byteString = encodeContents.UTF8Encode();
-  uint8_t* data = static_cast<CBC_OnedCode128Writer*>(m_pBCWriter)
+  uint8_t* data = static_cast<CBC_OnedCode128Writer*>(m_pBCWriter.get())
                       ->Encode(byteString, format, outWidth, outHeight, e);
   BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
-  ((CBC_OneDimWriter*)m_pBCWriter)
+  static_cast<CBC_OneDimWriter*>(m_pBCWriter.get())
       ->RenderResult(encodeContents.AsStringC(), data, outWidth, isDevice, e);
   FX_Free(data);
   BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
@@ -75,14 +73,14 @@
 FX_BOOL CBC_Code128::RenderDevice(CFX_RenderDevice* device,
                                   const CFX_Matrix* matrix,
                                   int32_t& e) {
-  ((CBC_OneDimWriter*)m_pBCWriter)
+  static_cast<CBC_OneDimWriter*>(m_pBCWriter.get())
       ->RenderDeviceResult(device, matrix, m_renderContents.AsStringC(), e);
   BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
   return TRUE;
 }
 
 FX_BOOL CBC_Code128::RenderBitmap(CFX_DIBitmap*& pOutBitmap, int32_t& e) {
-  ((CBC_OneDimWriter*)m_pBCWriter)
+  static_cast<CBC_OneDimWriter*>(m_pBCWriter.get())
       ->RenderBitmapResult(pOutBitmap, m_renderContents.AsStringC(), e);
   BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
   return TRUE;
diff --git a/xfa/fxbarcode/cbc_code39.cpp b/xfa/fxbarcode/cbc_code39.cpp
index 5d00d77..03e618e 100644
--- a/xfa/fxbarcode/cbc_code39.cpp
+++ b/xfa/fxbarcode/cbc_code39.cpp
@@ -27,26 +27,18 @@
 #include "xfa/fxbarcode/oned/BC_OnedCode39Reader.h"
 #include "xfa/fxbarcode/oned/BC_OnedCode39Writer.h"
 
-CBC_Code39::CBC_Code39() {
-  m_pBCReader = (CBC_Reader*)new (CBC_OnedCode39Reader);
-  m_pBCWriter = (CBC_Writer*)new (CBC_OnedCode39Writer);
-}
+CBC_Code39::CBC_Code39()
+    : CBC_OneCode(new CBC_OnedCode39Reader, new CBC_OnedCode39Writer) {}
 
-CBC_Code39::CBC_Code39(FX_BOOL usingCheckDigit) {
-  m_pBCReader = (CBC_Reader*)new CBC_OnedCode39Reader(usingCheckDigit);
-  m_pBCWriter = (CBC_Writer*)new CBC_OnedCode39Writer;
-}
+CBC_Code39::CBC_Code39(FX_BOOL usingCheckDigit)
+    : CBC_OneCode(new CBC_OnedCode39Reader(usingCheckDigit),
+                  new CBC_OnedCode39Writer) {}
 
-CBC_Code39::CBC_Code39(FX_BOOL usingCheckDigit, FX_BOOL extendedMode) {
-  m_pBCReader =
-      (CBC_Reader*)new CBC_OnedCode39Reader(usingCheckDigit, extendedMode);
-  m_pBCWriter = (CBC_Writer*)new CBC_OnedCode39Writer(extendedMode);
-}
+CBC_Code39::CBC_Code39(FX_BOOL usingCheckDigit, FX_BOOL extendedMode)
+    : CBC_OneCode(new CBC_OnedCode39Reader(usingCheckDigit, extendedMode),
+                  new CBC_OnedCode39Writer(extendedMode)) {}
 
-CBC_Code39::~CBC_Code39() {
-  delete (m_pBCReader);
-  delete (m_pBCWriter);
-}
+CBC_Code39::~CBC_Code39() {}
 
 FX_BOOL CBC_Code39::Encode(const CFX_WideStringC& contents,
                            FX_BOOL isDevice,
@@ -59,15 +51,17 @@
   int32_t outWidth = 0;
   int32_t outHeight = 0;
   CFX_WideString filtercontents =
-      ((CBC_OnedCode39Writer*)m_pBCWriter)->FilterContents(contents);
+      static_cast<CBC_OnedCode39Writer*>(m_pBCWriter.get())
+          ->FilterContents(contents);
   CFX_WideString renderContents =
-      ((CBC_OnedCode39Writer*)m_pBCWriter)->RenderTextContents(contents);
+      static_cast<CBC_OnedCode39Writer*>(m_pBCWriter.get())
+          ->RenderTextContents(contents);
   m_renderContents = renderContents;
   CFX_ByteString byteString = filtercontents.UTF8Encode();
-  uint8_t* data = static_cast<CBC_OnedCode39Writer*>(m_pBCWriter)
+  uint8_t* data = static_cast<CBC_OnedCode39Writer*>(m_pBCWriter.get())
                       ->Encode(byteString, format, outWidth, outHeight, e);
   BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
-  ((CBC_OneDimWriter*)m_pBCWriter)
+  static_cast<CBC_OneDimWriter*>(m_pBCWriter.get())
       ->RenderResult(renderContents.AsStringC(), data, outWidth, isDevice, e);
   FX_Free(data);
   BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
@@ -78,9 +72,9 @@
                                  const CFX_Matrix* matrix,
                                  int32_t& e) {
   CFX_WideString renderCon =
-      ((CBC_OnedCode39Writer*)m_pBCWriter)
+      static_cast<CBC_OnedCode39Writer*>(m_pBCWriter.get())
           ->encodedContents(m_renderContents.AsStringC(), e);
-  ((CBC_OneDimWriter*)m_pBCWriter)
+  static_cast<CBC_OneDimWriter*>(m_pBCWriter.get())
       ->RenderDeviceResult(device, matrix, renderCon.AsStringC(), e);
   BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
   return TRUE;
@@ -88,9 +82,9 @@
 
 FX_BOOL CBC_Code39::RenderBitmap(CFX_DIBitmap*& pOutBitmap, int32_t& e) {
   CFX_WideString renderCon =
-      ((CBC_OnedCode39Writer*)m_pBCWriter)
+      static_cast<CBC_OnedCode39Writer*>(m_pBCWriter.get())
           ->encodedContents(m_renderContents.AsStringC(), e);
-  ((CBC_OneDimWriter*)m_pBCWriter)
+  static_cast<CBC_OneDimWriter*>(m_pBCWriter.get())
       ->RenderBitmapResult(pOutBitmap, renderCon.AsStringC(), e);
   BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
   return TRUE;
@@ -115,12 +109,14 @@
 
 FX_BOOL CBC_Code39::SetTextLocation(BC_TEXT_LOC location) {
   if (m_pBCWriter)
-    return ((CBC_OnedCode39Writer*)m_pBCWriter)->SetTextLocation(location);
+    return static_cast<CBC_OnedCode39Writer*>(m_pBCWriter.get())
+        ->SetTextLocation(location);
   return FALSE;
 }
 
 FX_BOOL CBC_Code39::SetWideNarrowRatio(int32_t ratio) {
   if (m_pBCWriter)
-    return ((CBC_OnedCode39Writer*)m_pBCWriter)->SetWideNarrowRatio(ratio);
+    return static_cast<CBC_OnedCode39Writer*>(m_pBCWriter.get())
+        ->SetWideNarrowRatio(ratio);
   return FALSE;
 }
diff --git a/xfa/fxbarcode/cbc_codebase.cpp b/xfa/fxbarcode/cbc_codebase.cpp
index 64a358a..7065c2e 100644
--- a/xfa/fxbarcode/cbc_codebase.cpp
+++ b/xfa/fxbarcode/cbc_codebase.cpp
@@ -21,9 +21,11 @@
 
 #include "xfa/fxbarcode/cbc_codebase.h"
 
+#include "xfa/fxbarcode/BC_Reader.h"
 #include "xfa/fxbarcode/BC_Writer.h"
 
-CBC_CodeBase::CBC_CodeBase() {}
+CBC_CodeBase::CBC_CodeBase(CBC_Reader* pReader, CBC_Writer* pWriter)
+    : m_pBCReader(pReader), m_pBCWriter(pWriter) {}
 
 CBC_CodeBase::~CBC_CodeBase() {}
 
diff --git a/xfa/fxbarcode/cbc_codebase.h b/xfa/fxbarcode/cbc_codebase.h
index 2124f75..1ecfe20 100644
--- a/xfa/fxbarcode/cbc_codebase.h
+++ b/xfa/fxbarcode/cbc_codebase.h
@@ -7,6 +7,8 @@
 #ifndef XFA_FXBARCODE_CBC_CODEBASE_H_
 #define XFA_FXBARCODE_CBC_CODEBASE_H_
 
+#include <memory>
+
 #include "core/fxcrt/include/fx_system.h"
 #include "core/fxge/include/fx_dib.h"
 #include "xfa/fxbarcode/include/BC_Library.h"
@@ -18,7 +20,7 @@
 
 class CBC_CodeBase {
  public:
-  CBC_CodeBase();
+  CBC_CodeBase(CBC_Reader* pReader, CBC_Writer* pWriter);
   virtual ~CBC_CodeBase();
 
   virtual BC_TYPE GetType() = 0;
@@ -35,18 +37,17 @@
                                 int32_t& e) = 0;
   virtual CFX_WideString Decode(CFX_DIBitmap* pBitmap, int32_t& e) = 0;
 
-  virtual FX_BOOL SetCharEncoding(int32_t encoding);
-  virtual FX_BOOL SetModuleHeight(int32_t moduleHeight);
-  virtual FX_BOOL SetModuleWidth(int32_t moduleWidth);
-
-  virtual FX_BOOL SetHeight(int32_t height);
-  virtual FX_BOOL SetWidth(int32_t width);
-  virtual void SetBackgroundColor(FX_ARGB backgroundColor);
-  virtual void SetBarcodeColor(FX_ARGB foregroundColor);
+  FX_BOOL SetCharEncoding(int32_t encoding);
+  FX_BOOL SetModuleHeight(int32_t moduleHeight);
+  FX_BOOL SetModuleWidth(int32_t moduleWidth);
+  FX_BOOL SetHeight(int32_t height);
+  FX_BOOL SetWidth(int32_t width);
+  void SetBackgroundColor(FX_ARGB backgroundColor);
+  void SetBarcodeColor(FX_ARGB foregroundColor);
 
  protected:
-  CBC_Writer* m_pBCWriter;
-  CBC_Reader* m_pBCReader;
+  std::unique_ptr<CBC_Reader> m_pBCReader;
+  std::unique_ptr<CBC_Writer> m_pBCWriter;
 };
 
 #endif  // XFA_FXBARCODE_CBC_CODEBASE_H_
diff --git a/xfa/fxbarcode/cbc_datamatrix.cpp b/xfa/fxbarcode/cbc_datamatrix.cpp
index 7430187..08b7683 100644
--- a/xfa/fxbarcode/cbc_datamatrix.cpp
+++ b/xfa/fxbarcode/cbc_datamatrix.cpp
@@ -27,16 +27,12 @@
 #include "xfa/fxbarcode/datamatrix/BC_DataMatrixReader.h"
 #include "xfa/fxbarcode/datamatrix/BC_DataMatrixWriter.h"
 
-CBC_DataMatrix::CBC_DataMatrix() {
-  m_pBCReader = (CBC_Reader*)new (CBC_DataMatrixReader);
-  ((CBC_DataMatrixReader*)m_pBCReader)->Init();
-  m_pBCWriter = (CBC_Writer*)new (CBC_DataMatrixWriter);
+CBC_DataMatrix::CBC_DataMatrix()
+    : CBC_CodeBase(new CBC_DataMatrixReader, new CBC_DataMatrixWriter) {
+  static_cast<CBC_DataMatrixReader*>(m_pBCReader.get())->Init();
 }
 
-CBC_DataMatrix::~CBC_DataMatrix() {
-  delete (m_pBCReader);
-  delete (m_pBCWriter);
-}
+CBC_DataMatrix::~CBC_DataMatrix() {}
 
 FX_BOOL CBC_DataMatrix::Encode(const CFX_WideStringC& contents,
                                FX_BOOL isDevice,
@@ -44,10 +40,11 @@
   int32_t outWidth = 0;
   int32_t outHeight = 0;
   uint8_t* data =
-      ((CBC_DataMatrixWriter*)m_pBCWriter)
+      static_cast<CBC_DataMatrixWriter*>(m_pBCWriter.get())
           ->Encode(CFX_WideString(contents), outWidth, outHeight, e);
   BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
-  ((CBC_TwoDimWriter*)m_pBCWriter)->RenderResult(data, outWidth, outHeight, e);
+  static_cast<CBC_TwoDimWriter*>(m_pBCWriter.get())
+      ->RenderResult(data, outWidth, outHeight, e);
   FX_Free(data);
   BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
   return TRUE;
@@ -56,12 +53,14 @@
 FX_BOOL CBC_DataMatrix::RenderDevice(CFX_RenderDevice* device,
                                      const CFX_Matrix* matrix,
                                      int32_t& e) {
-  ((CBC_TwoDimWriter*)m_pBCWriter)->RenderDeviceResult(device, matrix);
+  static_cast<CBC_TwoDimWriter*>(m_pBCWriter.get())
+      ->RenderDeviceResult(device, matrix);
   return TRUE;
 }
 
 FX_BOOL CBC_DataMatrix::RenderBitmap(CFX_DIBitmap*& pOutBitmap, int32_t& e) {
-  ((CBC_TwoDimWriter*)m_pBCWriter)->RenderBitmapResult(pOutBitmap, e);
+  static_cast<CBC_TwoDimWriter*>(m_pBCWriter.get())
+      ->RenderBitmapResult(pOutBitmap, e);
   BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
   return TRUE;
 }
diff --git a/xfa/fxbarcode/cbc_ean13.cpp b/xfa/fxbarcode/cbc_ean13.cpp
index ea67c9f..589af5b 100644
--- a/xfa/fxbarcode/cbc_ean13.cpp
+++ b/xfa/fxbarcode/cbc_ean13.cpp
@@ -27,27 +27,23 @@
 #include "xfa/fxbarcode/oned/BC_OnedEAN13Reader.h"
 #include "xfa/fxbarcode/oned/BC_OnedEAN13Writer.h"
 
-CBC_EAN13::CBC_EAN13() {
-  m_pBCReader = (CBC_Reader*)new (CBC_OnedEAN13Reader);
-  m_pBCWriter = (CBC_Writer*)new (CBC_OnedEAN13Writer);
-}
+CBC_EAN13::CBC_EAN13()
+    : CBC_OneCode(new CBC_OnedEAN13Reader, new CBC_OnedEAN13Writer) {}
 
-CBC_EAN13::~CBC_EAN13() {
-  delete (m_pBCReader);
-  delete (m_pBCWriter);
-}
+CBC_EAN13::~CBC_EAN13() {}
 
 CFX_WideString CBC_EAN13::Preprocess(const CFX_WideStringC& contents) {
   CFX_WideString encodeContents =
-      ((CBC_OnedEAN13Writer*)m_pBCWriter)->FilterContents(contents);
+      static_cast<CBC_OnedEAN13Writer*>(m_pBCWriter.get())
+          ->FilterContents(contents);
   int32_t length = encodeContents.GetLength();
   if (length <= 12) {
     for (int32_t i = 0; i < 12 - length; i++)
       encodeContents = FX_WCHAR('0') + encodeContents;
 
     CFX_ByteString byteString = encodeContents.UTF8Encode();
-    int32_t checksum =
-        ((CBC_OnedEAN13Writer*)m_pBCWriter)->CalcChecksum(byteString);
+    int32_t checksum = static_cast<CBC_OnedEAN13Writer*>(m_pBCWriter.get())
+                           ->CalcChecksum(byteString);
     byteString += checksum - 0 + '0';
     encodeContents = byteString.UTF8Decode();
   }
@@ -70,10 +66,10 @@
   CFX_WideString encodeContents = Preprocess(contents);
   CFX_ByteString byteString = encodeContents.UTF8Encode();
   m_renderContents = encodeContents;
-  uint8_t* data = static_cast<CBC_OnedEAN13Writer*>(m_pBCWriter)
+  uint8_t* data = static_cast<CBC_OnedEAN13Writer*>(m_pBCWriter.get())
                       ->Encode(byteString, format, outWidth, outHeight, e);
   BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
-  ((CBC_OneDimWriter*)m_pBCWriter)
+  static_cast<CBC_OneDimWriter*>(m_pBCWriter.get())
       ->RenderResult(encodeContents.AsStringC(), data, outWidth, isDevice, e);
   FX_Free(data);
   BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
@@ -83,14 +79,14 @@
 FX_BOOL CBC_EAN13::RenderDevice(CFX_RenderDevice* device,
                                 const CFX_Matrix* matrix,
                                 int32_t& e) {
-  ((CBC_OneDimWriter*)m_pBCWriter)
+  static_cast<CBC_OneDimWriter*>(m_pBCWriter.get())
       ->RenderDeviceResult(device, matrix, m_renderContents.AsStringC(), e);
   BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
   return TRUE;
 }
 
 FX_BOOL CBC_EAN13::RenderBitmap(CFX_DIBitmap*& pOutBitmap, int32_t& e) {
-  ((CBC_OneDimWriter*)m_pBCWriter)
+  static_cast<CBC_OneDimWriter*>(m_pBCWriter.get())
       ->RenderBitmapResult(pOutBitmap, m_renderContents.AsStringC(), e);
   BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
   return TRUE;
diff --git a/xfa/fxbarcode/cbc_ean8.cpp b/xfa/fxbarcode/cbc_ean8.cpp
index 418ef87..3f32d22 100644
--- a/xfa/fxbarcode/cbc_ean8.cpp
+++ b/xfa/fxbarcode/cbc_ean8.cpp
@@ -27,27 +27,23 @@
 #include "xfa/fxbarcode/oned/BC_OnedEAN8Reader.h"
 #include "xfa/fxbarcode/oned/BC_OnedEAN8Writer.h"
 
-CBC_EAN8::CBC_EAN8() {
-  m_pBCReader = (CBC_Reader*)new (CBC_OnedEAN8Reader);
-  m_pBCWriter = (CBC_Writer*)new (CBC_OnedEAN8Writer);
-}
+CBC_EAN8::CBC_EAN8()
+    : CBC_OneCode(new CBC_OnedEAN8Reader, new CBC_OnedEAN8Writer) {}
 
-CBC_EAN8::~CBC_EAN8() {
-  delete (m_pBCReader);
-  delete (m_pBCWriter);
-}
+CBC_EAN8::~CBC_EAN8() {}
 
 CFX_WideString CBC_EAN8::Preprocess(const CFX_WideStringC& contents) {
   CFX_WideString encodeContents =
-      ((CBC_OnedEAN8Writer*)m_pBCWriter)->FilterContents(contents);
+      static_cast<CBC_OnedEAN8Writer*>(m_pBCWriter.get())
+          ->FilterContents(contents);
   int32_t length = encodeContents.GetLength();
   if (length <= 7) {
     for (int32_t i = 0; i < 7 - length; i++)
       encodeContents = FX_WCHAR('0') + encodeContents;
 
     CFX_ByteString byteString = encodeContents.UTF8Encode();
-    int32_t checksum =
-        ((CBC_OnedEAN8Writer*)m_pBCWriter)->CalcChecksum(byteString);
+    int32_t checksum = static_cast<CBC_OnedEAN8Writer*>(m_pBCWriter.get())
+                           ->CalcChecksum(byteString);
     encodeContents += FX_WCHAR(checksum - 0 + '0');
   }
   if (length > 8)
@@ -69,10 +65,10 @@
   CFX_WideString encodeContents = Preprocess(contents);
   CFX_ByteString byteString = encodeContents.UTF8Encode();
   m_renderContents = encodeContents;
-  uint8_t* data = static_cast<CBC_OnedEAN8Writer*>(m_pBCWriter)
+  uint8_t* data = static_cast<CBC_OnedEAN8Writer*>(m_pBCWriter.get())
                       ->Encode(byteString, format, outWidth, outHeight, e);
   BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
-  ((CBC_OneDimWriter*)m_pBCWriter)
+  static_cast<CBC_OneDimWriter*>(m_pBCWriter.get())
       ->RenderResult(encodeContents.AsStringC(), data, outWidth, isDevice, e);
   FX_Free(data);
   BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
@@ -82,14 +78,14 @@
 FX_BOOL CBC_EAN8::RenderDevice(CFX_RenderDevice* device,
                                const CFX_Matrix* matrix,
                                int32_t& e) {
-  ((CBC_OneDimWriter*)m_pBCWriter)
+  static_cast<CBC_OneDimWriter*>(m_pBCWriter.get())
       ->RenderDeviceResult(device, matrix, m_renderContents.AsStringC(), e);
   BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
   return TRUE;
 }
 
 FX_BOOL CBC_EAN8::RenderBitmap(CFX_DIBitmap*& pOutBitmap, int32_t& e) {
-  ((CBC_OneDimWriter*)m_pBCWriter)
+  static_cast<CBC_OneDimWriter*>(m_pBCWriter.get())
       ->RenderBitmapResult(pOutBitmap, m_renderContents.AsStringC(), e);
   BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
   return TRUE;
diff --git a/xfa/fxbarcode/cbc_onecode.cpp b/xfa/fxbarcode/cbc_onecode.cpp
index f5e1a39..b435a59 100644
--- a/xfa/fxbarcode/cbc_onecode.cpp
+++ b/xfa/fxbarcode/cbc_onecode.cpp
@@ -23,55 +23,57 @@
 
 #include "xfa/fxbarcode/oned/BC_OneDimWriter.h"
 
-CBC_OneCode::CBC_OneCode() {}
+CBC_OneCode::CBC_OneCode(CBC_Reader* pReader, CBC_Writer* pWriter)
+    : CBC_CodeBase(pReader, pWriter) {}
 
 CBC_OneCode::~CBC_OneCode() {}
 
 FX_BOOL CBC_OneCode::CheckContentValidity(const CFX_WideStringC& contents) {
-  if (m_pBCWriter)
-    return ((CBC_OneDimWriter*)m_pBCWriter)->CheckContentValidity(contents);
-  return FALSE;
+  return m_pBCWriter &&
+         static_cast<CBC_OneDimWriter*>(m_pBCWriter.get())
+             ->CheckContentValidity(contents);
 }
 
 CFX_WideString CBC_OneCode::FilterContents(const CFX_WideStringC& contents) {
-  CFX_WideString tmp;
   if (!m_pBCWriter)
-    return tmp;
-  return ((CBC_OneDimWriter*)m_pBCWriter)->FilterContents(contents);
+    return CFX_WideString();
+  return static_cast<CBC_OneDimWriter*>(m_pBCWriter.get())
+      ->FilterContents(contents);
 }
 
 void CBC_OneCode::SetPrintChecksum(FX_BOOL checksum) {
   if (m_pBCWriter)
-    ((CBC_OneDimWriter*)m_pBCWriter)->SetPrintChecksum(checksum);
+    static_cast<CBC_OneDimWriter*>(m_pBCWriter.get())
+        ->SetPrintChecksum(checksum);
 }
 
 void CBC_OneCode::SetDataLength(int32_t length) {
   if (m_pBCWriter)
-    ((CBC_OneDimWriter*)m_pBCWriter)->SetDataLength(length);
+    static_cast<CBC_OneDimWriter*>(m_pBCWriter.get())->SetDataLength(length);
 }
 
 void CBC_OneCode::SetCalChecksum(FX_BOOL calc) {
   if (m_pBCWriter)
-    ((CBC_OneDimWriter*)m_pBCWriter)->SetCalcChecksum(calc);
+    static_cast<CBC_OneDimWriter*>(m_pBCWriter.get())->SetCalcChecksum(calc);
 }
 
 FX_BOOL CBC_OneCode::SetFont(CFX_Font* cFont) {
   if (m_pBCWriter)
-    return ((CBC_OneDimWriter*)m_pBCWriter)->SetFont(cFont);
+    return static_cast<CBC_OneDimWriter*>(m_pBCWriter.get())->SetFont(cFont);
   return FALSE;
 }
 
 void CBC_OneCode::SetFontSize(FX_FLOAT size) {
   if (m_pBCWriter)
-    ((CBC_OneDimWriter*)m_pBCWriter)->SetFontSize(size);
+    static_cast<CBC_OneDimWriter*>(m_pBCWriter.get())->SetFontSize(size);
 }
 
 void CBC_OneCode::SetFontStyle(int32_t style) {
   if (m_pBCWriter)
-    ((CBC_OneDimWriter*)m_pBCWriter)->SetFontStyle(style);
+    static_cast<CBC_OneDimWriter*>(m_pBCWriter.get())->SetFontStyle(style);
 }
 
 void CBC_OneCode::SetFontColor(FX_ARGB color) {
   if (m_pBCWriter)
-    ((CBC_OneDimWriter*)m_pBCWriter)->SetFontColor(color);
+    static_cast<CBC_OneDimWriter*>(m_pBCWriter.get())->SetFontColor(color);
 }
diff --git a/xfa/fxbarcode/cbc_onecode.h b/xfa/fxbarcode/cbc_onecode.h
index 6e447cc..a915f78 100644
--- a/xfa/fxbarcode/cbc_onecode.h
+++ b/xfa/fxbarcode/cbc_onecode.h
@@ -17,7 +17,7 @@
 
 class CBC_OneCode : public CBC_CodeBase {
  public:
-  CBC_OneCode();
+  CBC_OneCode(CBC_Reader* pReader, CBC_Writer* pWriter);
   ~CBC_OneCode() override;
 
   virtual FX_BOOL CheckContentValidity(const CFX_WideStringC& contents);
diff --git a/xfa/fxbarcode/cbc_pdf417i.cpp b/xfa/fxbarcode/cbc_pdf417i.cpp
index 228caed..514cc01 100644
--- a/xfa/fxbarcode/cbc_pdf417i.cpp
+++ b/xfa/fxbarcode/cbc_pdf417i.cpp
@@ -27,23 +27,19 @@
 #include "xfa/fxbarcode/pdf417/BC_PDF417Reader.h"
 #include "xfa/fxbarcode/pdf417/BC_PDF417Writer.h"
 
-CBC_PDF417I::CBC_PDF417I() {
-  m_pBCReader = (CBC_Reader*)new (CBC_PDF417Reader);
-  m_pBCWriter = (CBC_Writer*)new (CBC_PDF417Writer);
-}
+CBC_PDF417I::CBC_PDF417I()
+    : CBC_CodeBase(new CBC_PDF417Reader, new CBC_PDF417Writer) {}
 
-CBC_PDF417I::~CBC_PDF417I() {
-  delete (m_pBCReader);
-  delete (m_pBCWriter);
-}
+CBC_PDF417I::~CBC_PDF417I() {}
 
 FX_BOOL CBC_PDF417I::SetErrorCorrectionLevel(int32_t level) {
-  ((CBC_PDF417Writer*)m_pBCWriter)->SetErrorCorrectionLevel(level);
+  static_cast<CBC_PDF417Writer*>(m_pBCWriter.get())
+      ->SetErrorCorrectionLevel(level);
   return TRUE;
 }
 
 void CBC_PDF417I::SetTruncated(FX_BOOL truncated) {
-  ((CBC_PDF417Writer*)m_pBCWriter)->SetTruncated(truncated);
+  static_cast<CBC_PDF417Writer*>(m_pBCWriter.get())->SetTruncated(truncated);
 }
 
 FX_BOOL CBC_PDF417I::Encode(const CFX_WideStringC& contents,
@@ -52,10 +48,11 @@
   int32_t outWidth = 0;
   int32_t outHeight = 0;
   uint8_t* data =
-      ((CBC_PDF417Writer*)m_pBCWriter)
+      static_cast<CBC_PDF417Writer*>(m_pBCWriter.get())
           ->Encode(CFX_WideString(contents), outWidth, outHeight, e);
   BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
-  ((CBC_TwoDimWriter*)m_pBCWriter)->RenderResult(data, outWidth, outHeight, e);
+  static_cast<CBC_TwoDimWriter*>(m_pBCWriter.get())
+      ->RenderResult(data, outWidth, outHeight, e);
   FX_Free(data);
   BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
   return TRUE;
@@ -64,12 +61,14 @@
 FX_BOOL CBC_PDF417I::RenderDevice(CFX_RenderDevice* device,
                                   const CFX_Matrix* matrix,
                                   int32_t& e) {
-  ((CBC_TwoDimWriter*)m_pBCWriter)->RenderDeviceResult(device, matrix);
+  static_cast<CBC_TwoDimWriter*>(m_pBCWriter.get())
+      ->RenderDeviceResult(device, matrix);
   return TRUE;
 }
 
 FX_BOOL CBC_PDF417I::RenderBitmap(CFX_DIBitmap*& pOutBitmap, int32_t& e) {
-  ((CBC_TwoDimWriter*)m_pBCWriter)->RenderBitmapResult(pOutBitmap, e);
+  static_cast<CBC_TwoDimWriter*>(m_pBCWriter.get())
+      ->RenderBitmapResult(pOutBitmap, e);
   BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
   return TRUE;
 }
diff --git a/xfa/fxbarcode/cbc_qrcode.cpp b/xfa/fxbarcode/cbc_qrcode.cpp
index 6f93b44..9ea20a6 100644
--- a/xfa/fxbarcode/cbc_qrcode.cpp
+++ b/xfa/fxbarcode/cbc_qrcode.cpp
@@ -27,31 +27,27 @@
 #include "xfa/fxbarcode/qrcode/BC_QRCodeReader.h"
 #include "xfa/fxbarcode/qrcode/BC_QRCodeWriter.h"
 
-CBC_QRCode::CBC_QRCode() {
-  m_pBCReader = (CBC_Reader*)new (CBC_QRCodeReader);
-  ((CBC_QRCodeReader*)m_pBCReader)->Init();
-  m_pBCWriter = (CBC_Writer*)new (CBC_QRCodeWriter);
+CBC_QRCode::CBC_QRCode()
+    : CBC_CodeBase(new CBC_QRCodeReader, new CBC_QRCodeWriter) {
+  static_cast<CBC_QRCodeReader*>(m_pBCReader.get())->Init();
 }
 
-CBC_QRCode::~CBC_QRCode() {
-  delete (m_pBCReader);
-  delete (m_pBCWriter);
-}
+CBC_QRCode::~CBC_QRCode() {}
 
 FX_BOOL CBC_QRCode::SetVersion(int32_t version) {
   if (version < 0 || version > 40)
     return FALSE;
-  if (!m_pBCWriter)
-    return FALSE;
-  return ((CBC_QRCodeWriter*)m_pBCWriter)->SetVersion(version);
+  return m_pBCWriter &&
+         static_cast<CBC_QRCodeWriter*>(m_pBCWriter.get())->SetVersion(version);
 }
 
 FX_BOOL CBC_QRCode::SetErrorCorrectionLevel(int32_t level) {
   if (level < 0 || level > 3)
     return FALSE;
-  if (!m_pBCWriter)
-    return FALSE;
-  return ((CBC_TwoDimWriter*)m_pBCWriter)->SetErrorCorrectionLevel(level);
+
+  return m_pBCWriter &&
+         static_cast<CBC_TwoDimWriter*>(m_pBCWriter.get())
+             ->SetErrorCorrectionLevel(level);
 }
 
 FX_BOOL CBC_QRCode::Encode(const CFX_WideStringC& contents,
@@ -59,13 +55,12 @@
                            int32_t& e) {
   int32_t outWidth = 0;
   int32_t outHeight = 0;
-  uint8_t* data =
-      ((CBC_QRCodeWriter*)m_pBCWriter)
-          ->Encode(CFX_WideString(contents),
-                   ((CBC_QRCodeWriter*)m_pBCWriter)->GetErrorCorrectionLevel(),
-                   outWidth, outHeight, e);
+  CBC_QRCodeWriter* pWriter = static_cast<CBC_QRCodeWriter*>(m_pBCWriter.get());
+  uint8_t* data = pWriter->Encode(CFX_WideString(contents),
+                                  pWriter->GetErrorCorrectionLevel(), outWidth,
+                                  outHeight, e);
   BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
-  ((CBC_TwoDimWriter*)m_pBCWriter)->RenderResult(data, outWidth, outHeight, e);
+  pWriter->RenderResult(data, outWidth, outHeight, e);
   FX_Free(data);
   BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
   return TRUE;
@@ -74,12 +69,14 @@
 FX_BOOL CBC_QRCode::RenderDevice(CFX_RenderDevice* device,
                                  const CFX_Matrix* matrix,
                                  int32_t& e) {
-  ((CBC_TwoDimWriter*)m_pBCWriter)->RenderDeviceResult(device, matrix);
+  static_cast<CBC_TwoDimWriter*>(m_pBCWriter.get())
+      ->RenderDeviceResult(device, matrix);
   return TRUE;
 }
 
 FX_BOOL CBC_QRCode::RenderBitmap(CFX_DIBitmap*& pOutBitmap, int32_t& e) {
-  ((CBC_TwoDimWriter*)m_pBCWriter)->RenderBitmapResult(pOutBitmap, e);
+  static_cast<CBC_TwoDimWriter*>(m_pBCWriter.get())
+      ->RenderBitmapResult(pOutBitmap, e);
   BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
   return TRUE;
 }
diff --git a/xfa/fxbarcode/cbc_upca.cpp b/xfa/fxbarcode/cbc_upca.cpp
index 886525a..5256122 100644
--- a/xfa/fxbarcode/cbc_upca.cpp
+++ b/xfa/fxbarcode/cbc_upca.cpp
@@ -27,28 +27,24 @@
 #include "xfa/fxbarcode/oned/BC_OnedUPCAReader.h"
 #include "xfa/fxbarcode/oned/BC_OnedUPCAWriter.h"
 
-CBC_UPCA::CBC_UPCA() {
-  m_pBCReader = (CBC_Reader*)new (CBC_OnedUPCAReader);
-  ((CBC_OnedUPCAReader*)m_pBCReader)->Init();
-  m_pBCWriter = (CBC_Writer*)new (CBC_OnedUPCAWriter);
+CBC_UPCA::CBC_UPCA()
+    : CBC_OneCode(new CBC_OnedUPCAReader, new CBC_OnedUPCAWriter) {
+  static_cast<CBC_OnedUPCAReader*>(m_pBCReader.get())->Init();
 }
 
-CBC_UPCA::~CBC_UPCA() {
-  delete (m_pBCReader);
-  delete (m_pBCWriter);
-}
+CBC_UPCA::~CBC_UPCA() {}
 
 CFX_WideString CBC_UPCA::Preprocess(const CFX_WideStringC& contents) {
-  CFX_WideString encodeContents =
-      ((CBC_OnedUPCAWriter*)m_pBCWriter)->FilterContents(contents);
+  CBC_OnedUPCAWriter* pWriter =
+      static_cast<CBC_OnedUPCAWriter*>(m_pBCWriter.get());
+  CFX_WideString encodeContents = pWriter->FilterContents(contents);
   int32_t length = encodeContents.GetLength();
   if (length <= 11) {
     for (int32_t i = 0; i < 11 - length; i++)
       encodeContents = FX_WCHAR('0') + encodeContents;
 
     CFX_ByteString byteString = encodeContents.UTF8Encode();
-    int32_t checksum =
-        ((CBC_OnedUPCAWriter*)m_pBCWriter)->CalcChecksum(byteString);
+    int32_t checksum = pWriter->CalcChecksum(byteString);
     byteString += checksum - 0 + '0';
     encodeContents = byteString.UTF8Decode();
   }
@@ -71,12 +67,15 @@
   CFX_WideString encodeContents = Preprocess(contents);
   CFX_ByteString byteString = encodeContents.UTF8Encode();
   m_renderContents = encodeContents;
-  ((CBC_OnedUPCAWriter*)m_pBCWriter)->Init();
-  uint8_t* data = static_cast<CBC_OnedUPCAWriter*>(m_pBCWriter)
-                      ->Encode(byteString, format, outWidth, outHeight, e);
+
+  CBC_OnedUPCAWriter* pWriter =
+      static_cast<CBC_OnedUPCAWriter*>(m_pBCWriter.get());
+
+  pWriter->Init();
+  uint8_t* data = pWriter->Encode(byteString, format, outWidth, outHeight, e);
   BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
-  ((CBC_OneDimWriter*)m_pBCWriter)
-      ->RenderResult(encodeContents.AsStringC(), data, outWidth, isDevice, e);
+  pWriter->RenderResult(encodeContents.AsStringC(), data, outWidth, isDevice,
+                        e);
   FX_Free(data);
   BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
   return TRUE;
@@ -85,14 +84,14 @@
 FX_BOOL CBC_UPCA::RenderDevice(CFX_RenderDevice* device,
                                const CFX_Matrix* matrix,
                                int32_t& e) {
-  ((CBC_OneDimWriter*)m_pBCWriter)
+  static_cast<CBC_OneDimWriter*>(m_pBCWriter.get())
       ->RenderDeviceResult(device, matrix, m_renderContents.AsStringC(), e);
   BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
   return TRUE;
 }
 
 FX_BOOL CBC_UPCA::RenderBitmap(CFX_DIBitmap*& pOutBitmap, int32_t& e) {
-  ((CBC_OneDimWriter*)m_pBCWriter)
+  static_cast<CBC_OneDimWriter*>(m_pBCWriter.get())
       ->RenderBitmapResult(pOutBitmap, m_renderContents.AsStringC(), e);
   BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
   return TRUE;