Restructure EAN barcode classes to merge common code.

Add an additional layer of class hierarchy to merge some common code
between 3 very similar barcode implementations.

Change-Id: I435613006a59b1af8c7d05e7c8ba50f64a2c43b5
Reviewed-on: https://pdfium-review.googlesource.com/c/46150
Reviewed-by: Tom Sepez <tsepez@chromium.org>
Reviewed-by: Lei Zhang <thestig@chromium.org>
Commit-Queue: Lei Zhang <thestig@chromium.org>
diff --git a/fxbarcode/cbc_upca.cpp b/fxbarcode/cbc_upca.cpp
index 77c4c49..3a3e87f 100644
--- a/fxbarcode/cbc_upca.cpp
+++ b/fxbarcode/cbc_upca.cpp
@@ -26,56 +26,18 @@
 #include "fxbarcode/oned/BC_OnedUPCAWriter.h"
 #include "third_party/base/ptr_util.h"
 
-CBC_UPCA::CBC_UPCA() : CBC_OneCode(pdfium::MakeUnique<CBC_OnedUPCAWriter>()) {}
+CBC_UPCA::CBC_UPCA() : CBC_EANCode(pdfium::MakeUnique<CBC_OnedUPCAWriter>()) {}
 
-CBC_UPCA::~CBC_UPCA() {}
-
-WideString CBC_UPCA::Preprocess(const WideStringView& contents) {
-  CBC_OnedUPCAWriter* pWriter = GetOnedUPCAWriter();
-  WideString encodeContents = pWriter->FilterContents(contents);
-  size_t length = encodeContents.GetLength();
-  if (length <= 11) {
-    for (size_t i = 0; i < 11 - length; i++)
-      encodeContents = L'0' + encodeContents;
-
-    ByteString byteString = encodeContents.ToUTF8();
-    int32_t checksum = pWriter->CalcChecksum(byteString);
-    byteString += '0' + checksum;
-    encodeContents = WideString::FromUTF8(byteString.AsStringView());
-  } else {
-    encodeContents = encodeContents.Left(12);
-  }
-
-  return encodeContents;
-}
-
-bool CBC_UPCA::Encode(const WideStringView& contents) {
-  if (contents.IsEmpty())
-    return false;
-
-  BCFORMAT format = BCFORMAT_UPC_A;
-  int32_t outWidth = 0;
-  int32_t outHeight = 0;
-  m_renderContents = Preprocess(contents);
-  ByteString byteString = m_renderContents.ToUTF8();
-  CBC_OnedUPCAWriter* pWriter = GetOnedUPCAWriter();
-  pWriter->Init();
-  std::unique_ptr<uint8_t, FxFreeDeleter> data(
-      pWriter->Encode(byteString, format, outWidth, outHeight));
-  return data && pWriter->RenderResult(m_renderContents.AsStringView(),
-                                       data.get(), outWidth);
-}
-
-bool CBC_UPCA::RenderDevice(CFX_RenderDevice* device,
-                            const CFX_Matrix* matrix) {
-  return GetOnedUPCAWriter()->RenderDeviceResult(
-      device, matrix, m_renderContents.AsStringView());
-}
+CBC_UPCA::~CBC_UPCA() = default;
 
 BC_TYPE CBC_UPCA::GetType() {
   return BC_UPCA;
 }
 
-CBC_OnedUPCAWriter* CBC_UPCA::GetOnedUPCAWriter() {
-  return static_cast<CBC_OnedUPCAWriter*>(m_pBCWriter.get());
+BCFORMAT CBC_UPCA::GetFormat() const {
+  return BCFORMAT_UPC_A;
+}
+
+size_t CBC_UPCA::GetMaxLength() const {
+  return 11;
 }