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/BUILD.gn b/fxbarcode/BUILD.gn
index 19ced51..344a310 100644
--- a/fxbarcode/BUILD.gn
+++ b/fxbarcode/BUILD.gn
@@ -30,6 +30,8 @@
"cbc_ean13.h",
"cbc_ean8.cpp",
"cbc_ean8.h",
+ "cbc_eancode.cpp",
+ "cbc_eancode.h",
"cbc_onecode.cpp",
"cbc_onecode.h",
"cbc_pdf417i.cpp",
@@ -90,6 +92,8 @@
"oned/BC_OnedEAN8Writer.h",
"oned/BC_OnedEANChecksum.cpp",
"oned/BC_OnedEANChecksum.h",
+ "oned/BC_OnedEANWriter.cpp",
+ "oned/BC_OnedEANWriter.h",
"oned/BC_OnedUPCAWriter.cpp",
"oned/BC_OnedUPCAWriter.h",
"pdf417/BC_PDF417.cpp",
diff --git a/fxbarcode/cbc_ean13.cpp b/fxbarcode/cbc_ean13.cpp
index b038f81..934e61c 100644
--- a/fxbarcode/cbc_ean13.cpp
+++ b/fxbarcode/cbc_ean13.cpp
@@ -27,55 +27,18 @@
#include "third_party/base/ptr_util.h"
CBC_EAN13::CBC_EAN13()
- : CBC_OneCode(pdfium::MakeUnique<CBC_OnedEAN13Writer>()) {}
+ : CBC_EANCode(pdfium::MakeUnique<CBC_OnedEAN13Writer>()) {}
-CBC_EAN13::~CBC_EAN13() {}
-
-WideString CBC_EAN13::Preprocess(const WideStringView& contents) {
- auto* pWriter = GetOnedEAN13Writer();
- WideString encodeContents = pWriter->FilterContents(contents);
- size_t length = encodeContents.GetLength();
- if (length <= 12) {
- for (size_t i = 0; i < 12 - length; i++)
- encodeContents.InsertAtFront(L'0');
-
- ByteString byteString = encodeContents.ToUTF8();
- int32_t checksum = pWriter->CalcChecksum(byteString);
- byteString += checksum + '0';
- encodeContents = WideString::FromUTF8(byteString.AsStringView());
- } else {
- encodeContents = encodeContents.Left(13);
- }
-
- return encodeContents;
-}
-
-bool CBC_EAN13::Encode(const WideStringView& contents) {
- if (contents.IsEmpty())
- return false;
-
- BCFORMAT format = BCFORMAT_EAN_13;
- int32_t outWidth = 0;
- int32_t outHeight = 0;
- m_renderContents = Preprocess(contents);
- ByteString byteString = m_renderContents.ToUTF8();
- auto* pWriter = GetOnedEAN13Writer();
- 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_EAN13::RenderDevice(CFX_RenderDevice* device,
- const CFX_Matrix* matrix) {
- return GetOnedEAN13Writer()->RenderDeviceResult(
- device, matrix, m_renderContents.AsStringView());
-}
+CBC_EAN13::~CBC_EAN13() = default;
BC_TYPE CBC_EAN13::GetType() {
return BC_EAN13;
}
-CBC_OnedEAN13Writer* CBC_EAN13::GetOnedEAN13Writer() {
- return static_cast<CBC_OnedEAN13Writer*>(m_pBCWriter.get());
+BCFORMAT CBC_EAN13::GetFormat() const {
+ return BCFORMAT_EAN_13;
+}
+
+size_t CBC_EAN13::GetMaxLength() const {
+ return 12;
}
diff --git a/fxbarcode/cbc_ean13.h b/fxbarcode/cbc_ean13.h
index f5887c7..a82a03f 100644
--- a/fxbarcode/cbc_ean13.h
+++ b/fxbarcode/cbc_ean13.h
@@ -7,29 +7,21 @@
#ifndef FXBARCODE_CBC_EAN13_H_
#define FXBARCODE_CBC_EAN13_H_
-#include "core/fxcrt/fx_coordinates.h"
#include "core/fxcrt/fx_string.h"
#include "core/fxcrt/fx_system.h"
-#include "fxbarcode/cbc_onecode.h"
+#include "fxbarcode/cbc_eancode.h"
class CBC_OnedEAN13Writer;
-class CBC_EAN13 final : public CBC_OneCode {
+class CBC_EAN13 final : public CBC_EANCode {
public:
CBC_EAN13();
~CBC_EAN13() override;
- // CBC_OneCode:
- bool Encode(const WideStringView& contents) override;
- bool RenderDevice(CFX_RenderDevice* device,
- const CFX_Matrix* matrix) override;
+ // CBC_EANCode:
BC_TYPE GetType() override;
-
- private:
- CBC_OnedEAN13Writer* GetOnedEAN13Writer();
- WideString Preprocess(const WideStringView& contents);
-
- WideString m_renderContents;
+ BCFORMAT GetFormat() const override;
+ size_t GetMaxLength() const override;
};
#endif // FXBARCODE_CBC_EAN13_H_
diff --git a/fxbarcode/cbc_ean8.cpp b/fxbarcode/cbc_ean8.cpp
index d74a712..84ed672 100644
--- a/fxbarcode/cbc_ean8.cpp
+++ b/fxbarcode/cbc_ean8.cpp
@@ -26,54 +26,18 @@
#include "fxbarcode/oned/BC_OnedEAN8Writer.h"
#include "third_party/base/ptr_util.h"
-CBC_EAN8::CBC_EAN8() : CBC_OneCode(pdfium::MakeUnique<CBC_OnedEAN8Writer>()) {}
+CBC_EAN8::CBC_EAN8() : CBC_EANCode(pdfium::MakeUnique<CBC_OnedEAN8Writer>()) {}
-CBC_EAN8::~CBC_EAN8() {}
-
-WideString CBC_EAN8::Preprocess(const WideStringView& contents) {
- auto* pWriter = GetOnedEAN8Writer();
- WideString encodeContents = pWriter->FilterContents(contents);
- size_t length = encodeContents.GetLength();
- if (length <= 7) {
- for (size_t i = 0; i < 7 - length; i++)
- encodeContents = L'0' + encodeContents;
-
- ByteString byteString = encodeContents.ToUTF8();
- int32_t checksum = pWriter->CalcChecksum(byteString);
- encodeContents += L'0' + checksum;
- } else {
- encodeContents = encodeContents.Left(8);
- }
-
- return encodeContents;
-}
-
-bool CBC_EAN8::Encode(const WideStringView& contents) {
- if (contents.IsEmpty())
- return false;
-
- BCFORMAT format = BCFORMAT_EAN_8;
- int32_t outWidth = 0;
- int32_t outHeight = 0;
- m_renderContents = Preprocess(contents);
- ByteString byteString = m_renderContents.ToUTF8();
- auto* pWriter = GetOnedEAN8Writer();
- 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_EAN8::RenderDevice(CFX_RenderDevice* device,
- const CFX_Matrix* matrix) {
- return GetOnedEAN8Writer()->RenderDeviceResult(
- device, matrix, m_renderContents.AsStringView());
-}
+CBC_EAN8::~CBC_EAN8() = default;
BC_TYPE CBC_EAN8::GetType() {
return BC_EAN8;
}
-CBC_OnedEAN8Writer* CBC_EAN8::GetOnedEAN8Writer() {
- return static_cast<CBC_OnedEAN8Writer*>(m_pBCWriter.get());
+BCFORMAT CBC_EAN8::GetFormat() const {
+ return BCFORMAT_EAN_8;
+}
+
+size_t CBC_EAN8::GetMaxLength() const {
+ return 7;
}
diff --git a/fxbarcode/cbc_ean8.h b/fxbarcode/cbc_ean8.h
index d0c7b21..57c06fa 100644
--- a/fxbarcode/cbc_ean8.h
+++ b/fxbarcode/cbc_ean8.h
@@ -9,25 +9,19 @@
#include "core/fxcrt/fx_string.h"
#include "core/fxcrt/fx_system.h"
-#include "fxbarcode/cbc_onecode.h"
+#include "fxbarcode/cbc_eancode.h"
class CBC_OnedEAN8Writer;
-class CBC_EAN8 final : public CBC_OneCode {
+class CBC_EAN8 final : public CBC_EANCode {
public:
CBC_EAN8();
~CBC_EAN8() override;
- // CBC_OneCode:
- bool Encode(const WideStringView& contents) override;
- bool RenderDevice(CFX_RenderDevice* device,
- const CFX_Matrix* matrix) override;
+ // CBC_EANCode:
BC_TYPE GetType() override;
-
- private:
- CBC_OnedEAN8Writer* GetOnedEAN8Writer();
- WideString Preprocess(const WideStringView& contents);
- WideString m_renderContents;
+ BCFORMAT GetFormat() const override;
+ size_t GetMaxLength() const override;
};
#endif // FXBARCODE_CBC_EAN8_H_
diff --git a/fxbarcode/cbc_eancode.cpp b/fxbarcode/cbc_eancode.cpp
new file mode 100644
index 0000000..6325b85
--- /dev/null
+++ b/fxbarcode/cbc_eancode.cpp
@@ -0,0 +1,63 @@
+// Copyright 2018 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "fxbarcode/cbc_eancode.h"
+
+#include <utility>
+
+#include "fxbarcode/oned/BC_OnedEANWriter.h"
+
+CBC_EANCode::CBC_EANCode(std::unique_ptr<CBC_OneDimEANWriter> pWriter)
+ : CBC_OneCode(std::move(pWriter)) {}
+
+CBC_EANCode::~CBC_EANCode() = default;
+
+CBC_OneDimEANWriter* CBC_EANCode::GetOneDimEANWriter() {
+ return static_cast<CBC_OneDimEANWriter*>(m_pBCWriter.get());
+}
+
+bool CBC_EANCode::Encode(const WideStringView& contents) {
+ if (contents.IsEmpty())
+ return false;
+
+ BCFORMAT format = GetFormat();
+ int32_t out_width = 0;
+ int32_t out_height = 0;
+ m_renderContents = Preprocess(contents);
+ ByteString str = m_renderContents.ToUTF8();
+ auto* pWriter = GetOneDimEANWriter();
+ pWriter->InitEANWriter();
+ std::unique_ptr<uint8_t, FxFreeDeleter> data(
+ pWriter->Encode(str, format, out_width, out_height));
+ return data && pWriter->RenderResult(m_renderContents.AsStringView(),
+ data.get(), out_width);
+}
+
+bool CBC_EANCode::RenderDevice(CFX_RenderDevice* device,
+ const CFX_Matrix* matrix) {
+ return GetOneDimEANWriter()->RenderDeviceResult(
+ device, matrix, m_renderContents.AsStringView());
+}
+
+WideString CBC_EANCode::Preprocess(const WideStringView& contents) {
+ auto* pWriter = GetOneDimEANWriter();
+ WideString encoded_contents = pWriter->FilterContents(contents);
+ size_t length = encoded_contents.GetLength();
+ size_t max_length = GetMaxLength();
+ if (length <= max_length) {
+ for (size_t i = 0; i < max_length - length; i++)
+ encoded_contents.InsertAtFront(L'0');
+
+ ByteString str = encoded_contents.ToUTF8();
+ int32_t checksum = pWriter->CalcChecksum(str);
+ str += '0' + checksum;
+ encoded_contents = WideString::FromUTF8(str.AsStringView());
+ } else {
+ encoded_contents = encoded_contents.Left(max_length + 1);
+ }
+
+ return encoded_contents;
+}
diff --git a/fxbarcode/cbc_eancode.h b/fxbarcode/cbc_eancode.h
new file mode 100644
index 0000000..5c2e737
--- /dev/null
+++ b/fxbarcode/cbc_eancode.h
@@ -0,0 +1,38 @@
+// Copyright 2018 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef FXBARCODE_CBC_EANCODE_H_
+#define FXBARCODE_CBC_EANCODE_H_
+
+#include <memory>
+
+#include "core/fxcrt/fx_string.h"
+#include "fxbarcode/cbc_onecode.h"
+#include "fxbarcode/utils.h"
+
+class CBC_OneDimEANWriter;
+
+class CBC_EANCode : public CBC_OneCode {
+ public:
+ explicit CBC_EANCode(std::unique_ptr<CBC_OneDimEANWriter> pWriter);
+ ~CBC_EANCode() override;
+
+ virtual BCFORMAT GetFormat() const = 0;
+ virtual size_t GetMaxLength() const = 0;
+
+ // CBC_EANCode:
+ bool Encode(const WideStringView& contents) override;
+ bool RenderDevice(CFX_RenderDevice* device,
+ const CFX_Matrix* matrix) override;
+
+ protected:
+ CBC_OneDimEANWriter* GetOneDimEANWriter();
+ WideString Preprocess(const WideStringView& contents);
+
+ WideString m_renderContents;
+};
+
+#endif // FXBARCODE_CBC_EANCODE_H_
diff --git a/fxbarcode/cbc_onecode.h b/fxbarcode/cbc_onecode.h
index eae618e..946911c 100644
--- a/fxbarcode/cbc_onecode.h
+++ b/fxbarcode/cbc_onecode.h
@@ -24,13 +24,13 @@
virtual bool CheckContentValidity(const WideStringView& contents);
virtual WideString FilterContents(const WideStringView& contents);
- virtual void SetPrintChecksum(bool checksum);
- virtual void SetDataLength(int32_t length);
- virtual void SetCalChecksum(bool calc);
- virtual bool SetFont(CFX_Font* cFont);
- virtual void SetFontSize(float size);
- virtual void SetFontStyle(int32_t style);
- virtual void SetFontColor(FX_ARGB color);
+ void SetPrintChecksum(bool checksum);
+ void SetDataLength(int32_t length);
+ void SetCalChecksum(bool calc);
+ bool SetFont(CFX_Font* cFont);
+ void SetFontSize(float size);
+ void SetFontStyle(int32_t style);
+ void SetFontColor(FX_ARGB color);
private:
CBC_OneDimWriter* GetOneDimWriter();
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;
}
diff --git a/fxbarcode/cbc_upca.h b/fxbarcode/cbc_upca.h
index 89bfc52..bf71fc9 100644
--- a/fxbarcode/cbc_upca.h
+++ b/fxbarcode/cbc_upca.h
@@ -9,25 +9,19 @@
#include "core/fxcrt/fx_string.h"
#include "core/fxcrt/fx_system.h"
-#include "fxbarcode/cbc_onecode.h"
+#include "fxbarcode/cbc_eancode.h"
class CBC_OnedUPCAWriter;
-class CBC_UPCA final : public CBC_OneCode {
+class CBC_UPCA final : public CBC_EANCode {
public:
CBC_UPCA();
~CBC_UPCA() override;
- // CBC_CodeBase:
- bool Encode(const WideStringView& contents) override;
- bool RenderDevice(CFX_RenderDevice* device,
- const CFX_Matrix* matrix) override;
+ // CBC_EANCode:
BC_TYPE GetType() override;
-
- private:
- CBC_OnedUPCAWriter* GetOnedUPCAWriter();
- WideString Preprocess(const WideStringView& contents);
- WideString m_renderContents;
+ BCFORMAT GetFormat() const override;
+ size_t GetMaxLength() const override;
};
#endif // FXBARCODE_CBC_UPCA_H_
diff --git a/fxbarcode/oned/BC_OnedEAN13Writer.h b/fxbarcode/oned/BC_OnedEAN13Writer.h
index c800918..8436a4f 100644
--- a/fxbarcode/oned/BC_OnedEAN13Writer.h
+++ b/fxbarcode/oned/BC_OnedEAN13Writer.h
@@ -9,17 +9,17 @@
#include "core/fxcrt/fx_string.h"
#include "core/fxcrt/fx_system.h"
-#include "fxbarcode/oned/BC_OneDimWriter.h"
+#include "fxbarcode/oned/BC_OnedEANWriter.h"
class CFX_DIBitmap;
class CFX_RenderDevice;
-class CBC_OnedEAN13Writer final : public CBC_OneDimWriter {
+class CBC_OnedEAN13Writer final : public CBC_OneDimEANWriter {
public:
CBC_OnedEAN13Writer();
~CBC_OnedEAN13Writer() override;
- // CBC_OneDimWriter
+ // CBC_OneDimEANWriter:
uint8_t* EncodeWithHint(const ByteString& contents,
BCFORMAT format,
int32_t& outWidth,
@@ -28,8 +28,7 @@
uint8_t* EncodeImpl(const ByteString& contents, int32_t& outLength) override;
bool CheckContentValidity(const WideStringView& contents) override;
WideString FilterContents(const WideStringView& contents) override;
-
- int32_t CalcChecksum(const ByteString& contents);
+ int32_t CalcChecksum(const ByteString& contents) override;
private:
bool ShowChars(const WideStringView& contents,
diff --git a/fxbarcode/oned/BC_OnedEAN13Writer_unittest.cpp b/fxbarcode/oned/BC_OnedEAN13Writer_unittest.cpp
index 932e1f4..0f85496 100644
--- a/fxbarcode/oned/BC_OnedEAN13Writer_unittest.cpp
+++ b/fxbarcode/oned/BC_OnedEAN13Writer_unittest.cpp
@@ -9,6 +9,7 @@
TEST(OnedEAN13WriterTest, Encode) {
CBC_OnedEAN13Writer writer;
+ writer.InitEANWriter();
int32_t width;
int32_t height;
uint8_t* encoded;
@@ -89,6 +90,7 @@
TEST(OnedEAN13WriterTest, Checksum) {
CBC_OnedEAN13Writer writer;
+ writer.InitEANWriter();
EXPECT_EQ(0, writer.CalcChecksum(""));
EXPECT_EQ(6, writer.CalcChecksum("123"));
EXPECT_EQ(8, writer.CalcChecksum("123456789012"));
diff --git a/fxbarcode/oned/BC_OnedEAN8Writer.h b/fxbarcode/oned/BC_OnedEAN8Writer.h
index 6295c4e..9d107b9 100644
--- a/fxbarcode/oned/BC_OnedEAN8Writer.h
+++ b/fxbarcode/oned/BC_OnedEAN8Writer.h
@@ -10,17 +10,17 @@
#include "core/fxcrt/fx_string.h"
#include "core/fxcrt/fx_system.h"
#include "fxbarcode/BC_Library.h"
-#include "fxbarcode/oned/BC_OneDimWriter.h"
+#include "fxbarcode/oned/BC_OnedEANWriter.h"
class CFX_DIBitmap;
class CFX_RenderDevice;
-class CBC_OnedEAN8Writer final : public CBC_OneDimWriter {
+class CBC_OnedEAN8Writer final : public CBC_OneDimEANWriter {
public:
CBC_OnedEAN8Writer();
~CBC_OnedEAN8Writer() override;
- // CBC_OneDimWriter
+ // CBC_OneDimEANWriter:
uint8_t* EncodeWithHint(const ByteString& contents,
BCFORMAT format,
int32_t& outWidth,
@@ -31,8 +31,7 @@
WideString FilterContents(const WideStringView& contents) override;
void SetDataLength(int32_t length) override;
bool SetTextLocation(BC_TEXT_LOC location) override;
-
- int32_t CalcChecksum(const ByteString& contents);
+ int32_t CalcChecksum(const ByteString& contents) override;
private:
bool ShowChars(const WideStringView& contents,
diff --git a/fxbarcode/oned/BC_OnedEAN8Writer_unittest.cpp b/fxbarcode/oned/BC_OnedEAN8Writer_unittest.cpp
index 16a1df6..55a0a33 100644
--- a/fxbarcode/oned/BC_OnedEAN8Writer_unittest.cpp
+++ b/fxbarcode/oned/BC_OnedEAN8Writer_unittest.cpp
@@ -9,6 +9,7 @@
TEST(OnedEAN8WriterTest, Encode) {
CBC_OnedEAN8Writer writer;
+ writer.InitEANWriter();
int32_t width;
int32_t height;
uint8_t* encoded;
@@ -79,6 +80,7 @@
TEST(OnedEAN8WriterTest, Checksum) {
CBC_OnedEAN8Writer writer;
+ writer.InitEANWriter();
EXPECT_EQ(0, writer.CalcChecksum(""));
EXPECT_EQ(6, writer.CalcChecksum("123"));
EXPECT_EQ(0, writer.CalcChecksum("1234567"));
diff --git a/fxbarcode/oned/BC_OnedEANWriter.cpp b/fxbarcode/oned/BC_OnedEANWriter.cpp
new file mode 100644
index 0000000..f43b9ad
--- /dev/null
+++ b/fxbarcode/oned/BC_OnedEANWriter.cpp
@@ -0,0 +1,11 @@
+// Copyright 2018 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "fxbarcode/oned/BC_OnedEANWriter.h"
+
+CBC_OneDimEANWriter::CBC_OneDimEANWriter() = default;
+
+CBC_OneDimEANWriter::~CBC_OneDimEANWriter() = default;
+
+void CBC_OneDimEANWriter::InitEANWriter() {}
diff --git a/fxbarcode/oned/BC_OnedEANWriter.h b/fxbarcode/oned/BC_OnedEANWriter.h
new file mode 100644
index 0000000..5d80167
--- /dev/null
+++ b/fxbarcode/oned/BC_OnedEANWriter.h
@@ -0,0 +1,19 @@
+// Copyright 2018 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef FXBARCODE_ONED_BC_ONEDEANWRITER_H_
+#define FXBARCODE_ONED_BC_ONEDEANWRITER_H_
+
+#include "fxbarcode/oned/BC_OneDimWriter.h"
+
+class CBC_OneDimEANWriter : public CBC_OneDimWriter {
+ public:
+ CBC_OneDimEANWriter();
+ ~CBC_OneDimEANWriter() override;
+
+ virtual void InitEANWriter();
+ virtual int32_t CalcChecksum(const ByteString& contents) = 0;
+};
+
+#endif // FXBARCODE_ONED_BC_ONEDEANWRITER_H_
diff --git a/fxbarcode/oned/BC_OnedUPCAWriter.cpp b/fxbarcode/oned/BC_OnedUPCAWriter.cpp
index 9e7400a..d3b9226 100644
--- a/fxbarcode/oned/BC_OnedUPCAWriter.cpp
+++ b/fxbarcode/oned/BC_OnedUPCAWriter.cpp
@@ -36,10 +36,6 @@
m_bRightPadding = true;
}
-void CBC_OnedUPCAWriter::Init() {
- m_subWriter = pdfium::MakeUnique<CBC_OnedEAN13Writer>();
-}
-
CBC_OnedUPCAWriter::~CBC_OnedUPCAWriter() {}
bool CBC_OnedUPCAWriter::CheckContentValidity(const WideStringView& contents) {
@@ -66,6 +62,10 @@
return filtercontents;
}
+void CBC_OnedUPCAWriter::InitEANWriter() {
+ m_subWriter = pdfium::MakeUnique<CBC_OnedEAN13Writer>();
+}
+
int32_t CBC_OnedUPCAWriter::CalcChecksum(const ByteString& contents) {
int32_t odd = 0;
int32_t even = 0;
diff --git a/fxbarcode/oned/BC_OnedUPCAWriter.h b/fxbarcode/oned/BC_OnedUPCAWriter.h
index 6101b4d..8e2f770 100644
--- a/fxbarcode/oned/BC_OnedUPCAWriter.h
+++ b/fxbarcode/oned/BC_OnedUPCAWriter.h
@@ -11,19 +11,19 @@
#include "core/fxcrt/fx_string.h"
#include "core/fxcrt/fx_system.h"
-#include "fxbarcode/oned/BC_OneDimWriter.h"
+#include "fxbarcode/oned/BC_OnedEANWriter.h"
class CBC_OnedEAN13Writer;
class CFX_DIBitmap;
class CFX_Matrix;
class CFX_RenderDevice;
-class CBC_OnedUPCAWriter final : public CBC_OneDimWriter {
+class CBC_OnedUPCAWriter final : public CBC_OneDimEANWriter {
public:
CBC_OnedUPCAWriter();
~CBC_OnedUPCAWriter() override;
- // CBC_OneDimWriter
+ // CBC_OneDimEANWriter:
uint8_t* EncodeWithHint(const ByteString& contents,
BCFORMAT format,
int32_t& outWidth,
@@ -32,9 +32,8 @@
uint8_t* EncodeImpl(const ByteString& contents, int32_t& outLength) override;
bool CheckContentValidity(const WideStringView& contents) override;
WideString FilterContents(const WideStringView& contents) override;
-
- void Init();
- int32_t CalcChecksum(const ByteString& contents);
+ void InitEANWriter() override;
+ int32_t CalcChecksum(const ByteString& contents) override;
private:
bool ShowChars(const WideStringView& contents,
diff --git a/fxbarcode/oned/BC_OnedUPCAWriter_unittest.cpp b/fxbarcode/oned/BC_OnedUPCAWriter_unittest.cpp
index 3d9f6c5..cd9ff47 100644
--- a/fxbarcode/oned/BC_OnedUPCAWriter_unittest.cpp
+++ b/fxbarcode/oned/BC_OnedUPCAWriter_unittest.cpp
@@ -9,13 +9,10 @@
TEST(OnedUPCAWriterTest, Encode) {
CBC_OnedUPCAWriter writer;
+ writer.InitEANWriter();
int32_t width;
int32_t height;
- // TODO(hnakashima): CBC_OnedUPCAWriter is unique in that it needs to be
- // Init()'d. Get rid of this call.
- writer.Init();
-
// UPCA barcodes encode 12-digit numbers into 95 modules in a unidimensional
// disposition.
uint8_t* encoded = writer.Encode("", BCFORMAT_UPC_A, width, height);
@@ -87,6 +84,7 @@
TEST(OnedUPCAWriterTest, Checksum) {
CBC_OnedUPCAWriter writer;
+ writer.InitEANWriter();
EXPECT_EQ(0, writer.CalcChecksum(""));
EXPECT_EQ(6, writer.CalcChecksum("123"));
EXPECT_EQ(2, writer.CalcChecksum("12345678901"));