diff --git a/BUILD.gn b/BUILD.gn
index 904dc69..10b600e 100644
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -1029,7 +1029,6 @@
       "xfa/fwl/theme/pushbuttontp.cpp",
       "xfa/fwl/theme/scrollbartp.cpp",
       "xfa/fwl/theme/widgettp.cpp",
-      "xfa/fxbarcode/BC_BarCode.cpp",
       "xfa/fxbarcode/BC_Binarizer.cpp",
       "xfa/fxbarcode/BC_Binarizer.h",
       "xfa/fxbarcode/BC_BinaryBitmap.cpp",
@@ -1472,7 +1471,29 @@
       "xfa/include/fwl/theme/scrollbartp.h",
       "xfa/include/fwl/theme/utils.h",
       "xfa/include/fwl/theme/widgettp.h",
-      "xfa/include/fxbarcode/BC_BarCode.h",
+      "xfa/fxbarcode/include/BC_Library.h",
+      "xfa/fxbarcode/cbc_codebase.h",
+      "xfa/fxbarcode/cbc_codebase.cpp",
+      "xfa/fxbarcode/cbc_onecode.h",
+      "xfa/fxbarcode/cbc_onecode.cpp",
+      "xfa/fxbarcode/cbc_code39.h",
+      "xfa/fxbarcode/cbc_code39.cpp",
+      "xfa/fxbarcode/cbc_codabar.h",
+      "xfa/fxbarcode/cbc_ean13.h",
+      "xfa/fxbarcode/cbc_ean13.cpp",
+      "xfa/fxbarcode/cbc_upca.h",
+      "xfa/fxbarcode/cbc_upca.cpp",
+      "xfa/fxbarcode/cbc_qrcode.h",
+      "xfa/fxbarcode/cbc_qrcode.cpp",
+      "xfa/fxbarcode/cbc_pdf417i.h",
+      "xfa/fxbarcode/cbc_pdf417i.cpp",
+      "xfa/fxbarcode/cbc_datamatrix.h",
+      "xfa/fxbarcode/cbc_datamatrix.cpp",
+      "xfa/fxbarcode/cbc_codabar.cpp",
+      "xfa/fxbarcode/cbc_code128.h",
+      "xfa/fxbarcode/cbc_code128.cpp",
+      "xfa/fxbarcode/cbc_ean8.h",
+      "xfa/fxbarcode/cbc_ean8.cpp",
       "xfa/include/fxfa/fxfa.h",
       "xfa/include/fxfa/fxfa_basic.h",
       "xfa/include/fxfa/fxfa_objectacc.h",
diff --git a/fpdfsdk/fpdfxfa/DEPS b/fpdfsdk/fpdfxfa/DEPS
new file mode 100644
index 0000000..7f85f28
--- /dev/null
+++ b/fpdfsdk/fpdfxfa/DEPS
@@ -0,0 +1,3 @@
+include_rules = [
+  '+xfa/fxbarcode/include',
+]
diff --git a/fpdfsdk/fpdfxfa/fpdfxfa_app.cpp b/fpdfsdk/fpdfxfa/fpdfxfa_app.cpp
index 910cdc5..ea3a1c9 100644
--- a/fpdfsdk/fpdfxfa/fpdfxfa_app.cpp
+++ b/fpdfsdk/fpdfxfa/fpdfxfa_app.cpp
@@ -11,7 +11,7 @@
 #include "fpdfsdk/include/fsdk_mgr.h"
 #include "fpdfsdk/include/javascript/IJavaScript.h"
 #include "public/fpdf_formfill.h"
-#include "xfa/include/fxbarcode/BC_BarCode.h"
+#include "xfa/fxbarcode/include/BC_Library.h"
 
 CPDFXFA_App* CPDFXFA_App::g_pApp = NULL;
 
diff --git a/xfa.gyp b/xfa.gyp
index 6e4c420..2185d6e 100644
--- a/xfa.gyp
+++ b/xfa.gyp
@@ -97,7 +97,6 @@
         "xfa/include/fwl/theme/scrollbartp.h",
         "xfa/include/fwl/theme/utils.h",
         "xfa/include/fwl/theme/widgettp.h",
-        "xfa/include/fxbarcode/BC_BarCode.h",
         "xfa/include/fxfa/fxfa.h",
         "xfa/include/fxfa/fxfa_basic.h",
         "xfa/include/fxfa/fxfa_objectacc.h",
@@ -270,6 +269,28 @@
         "xfa/fwl/theme/pushbuttontp.cpp",
         "xfa/fwl/theme/scrollbartp.cpp",
         "xfa/fwl/theme/widgettp.cpp",
+        "xfa/fxbarcode/cbc_code128.cpp",
+        "xfa/fxbarcode/cbc_code128.h",
+        "xfa/fxbarcode/cbc_code39.cpp",
+        "xfa/fxbarcode/cbc_code39.h",
+        "xfa/fxbarcode/cbc_codabar.cpp",
+        "xfa/fxbarcode/cbc_codabar.h",
+        "xfa/fxbarcode/cbc_codebase.cpp",
+        "xfa/fxbarcode/cbc_codebase.h",
+        "xfa/fxbarcode/cbc_datamatrix.cpp",
+        "xfa/fxbarcode/cbc_datamatrix.h",
+        "xfa/fxbarcode/cbc_ean8.cpp",
+        "xfa/fxbarcode/cbc_ena8.h",
+        "xfa/fxbarcode/cbc_ean13.cpp",
+        "xfa/fxbarcode/cbc_ean13.h",
+        "xfa/fxbarcode/cbc_onecode.cpp",
+        "xfa/fxbarcode/cbc_onecode.h",
+        "xfa/fxbarcode/cbc_pdf417i.cpp",
+        "xfa/fxbarcode/cbc_pdf417i.h",
+        "xfa/fxbarcode/cbc_qrcode.cpp",
+        "xfa/fxbarcode/cbc_qrcode.h",
+        "xfa/fxbarcode/cbc_upca.cpp",
+        "xfa/fxbarcode/cbc_upca.h",
         "xfa/fxbarcode/common/BC_CommonBitArray.cpp",
         "xfa/fxbarcode/common/BC_CommonBitMatrix.cpp",
         "xfa/fxbarcode/common/BC_CommonBitSource.cpp",
@@ -344,6 +365,7 @@
         "xfa/fxbarcode/datamatrix/BC_DefaultPlacement.h",
         "xfa/fxbarcode/datamatrix/BC_Encoder.h",
         "xfa/fxbarcode/datamatrix/BC_HighLevelEncoder.h",
+        "xfa/fxbarcode/include/BC_Library.h",
         "xfa/fxbarcode/oned/BC_OnedCodaBarReader.cpp",
         "xfa/fxbarcode/oned/BC_OnedCodaBarWriter.cpp",
         "xfa/fxbarcode/oned/BC_OnedCode128Reader.cpp",
@@ -480,7 +502,6 @@
         "xfa/fxbarcode/qrcode/BC_QRGridSampler.h",
         "xfa/fxbarcode/qrcode/BC_FinderPatternInfo.cpp",
         "xfa/fxbarcode/qrcode/BC_FinderPatternInfo.h",
-        "xfa/fxbarcode/BC_BarCode.cpp",
         "xfa/fxbarcode/BC_Binarizer.cpp",
         "xfa/fxbarcode/BC_BinaryBitmap.cpp",
         "xfa/fxbarcode/BC_BufferedImageLuminanceSource.cpp",
diff --git a/xfa/fwl/basewidget/fxmath_barcodeimp.cpp b/xfa/fwl/basewidget/fxmath_barcodeimp.cpp
index c27805e..9792c6f 100644
--- a/xfa/fwl/basewidget/fxmath_barcodeimp.cpp
+++ b/xfa/fwl/basewidget/fxmath_barcodeimp.cpp
@@ -6,6 +6,17 @@
 
 #include "xfa/fwl/basewidget/fxmath_barcodeimp.h"
 
+#include "xfa/fxbarcode/cbc_codabar.h"
+#include "xfa/fxbarcode/cbc_code128.h"
+#include "xfa/fxbarcode/cbc_code39.h"
+#include "xfa/fxbarcode/cbc_codebase.h"
+#include "xfa/fxbarcode/cbc_datamatrix.h"
+#include "xfa/fxbarcode/cbc_ean13.h"
+#include "xfa/fxbarcode/cbc_ean8.h"
+#include "xfa/fxbarcode/cbc_pdf417i.h"
+#include "xfa/fxbarcode/cbc_qrcode.h"
+#include "xfa/fxbarcode/cbc_upca.h"
+
 static CBC_CodeBase* FX_Barcode_CreateBarCodeEngineObject(BC_TYPE type) {
   switch (type) {
     case BC_CODE39:
@@ -42,7 +53,7 @@
     m_pBCEngine = NULL;
   }
 }
-FX_BOOL CFX_Barcode::Crreate(BC_TYPE type) {
+FX_BOOL CFX_Barcode::Create(BC_TYPE type) {
   m_pBCEngine = FX_Barcode_CreateBarCodeEngineObject(type);
   return m_pBCEngine != NULL;
 }
@@ -377,7 +388,7 @@
 }
 IFX_Barcode* FX_Barcode_Create(BC_TYPE type) {
   CFX_Barcode* pBarcode = new CFX_Barcode;
-  if (pBarcode->Crreate(type)) {
+  if (pBarcode->Create(type)) {
     return pBarcode;
   }
   pBarcode->Release();
diff --git a/xfa/fwl/basewidget/fxmath_barcodeimp.h b/xfa/fwl/basewidget/fxmath_barcodeimp.h
index a26761e..077aeea 100644
--- a/xfa/fwl/basewidget/fxmath_barcodeimp.h
+++ b/xfa/fwl/basewidget/fxmath_barcodeimp.h
@@ -7,13 +7,19 @@
 #ifndef XFA_FWL_BASEWIDGET_FXMATH_BARCODEIMP_H_
 #define XFA_FWL_BASEWIDGET_FXMATH_BARCODEIMP_H_
 
+#include "core/include/fxcrt/fx_string.h"
+#include "core/include/fxcrt/fx_system.h"
+#include "xfa/fxbarcode/include/BC_Library.h"
 #include "xfa/include/fwl/basewidget/fxmath_barcode.h"
 
+class CBC_CodeBase;
+
 class CFX_Barcode : public IFX_Barcode {
  public:
   CFX_Barcode();
   ~CFX_Barcode();
-  FX_BOOL Crreate(BC_TYPE type);
+
+  FX_BOOL Create(BC_TYPE type);
   virtual void Release();
   virtual BC_TYPE GetType();
   virtual FX_BOOL Encode(const CFX_WideStringC& contents,
diff --git a/xfa/fxbarcode/BC_BarCode.cpp b/xfa/fxbarcode/BC_BarCode.cpp
deleted file mode 100644
index 11f47b5..0000000
--- a/xfa/fxbarcode/BC_BarCode.cpp
+++ /dev/null
@@ -1,877 +0,0 @@
-// Copyright 2014 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
-// Original code is licensed as follows:
-/*
- * Copyright 2011 ZXing authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "xfa/fxbarcode/BC_Binarizer.h"
-#include "xfa/fxbarcode/BC_BinaryBitmap.h"
-#include "xfa/fxbarcode/BC_BinaryBitmap.h"
-#include "xfa/fxbarcode/BC_BufferedImageLuminanceSource.h"
-#include "xfa/fxbarcode/BC_DecoderResult.h"
-#include "xfa/fxbarcode/BC_LuminanceSource.h"
-#include "xfa/fxbarcode/BC_Reader.h"
-#include "xfa/fxbarcode/BC_ResultPoint.h"
-#include "xfa/fxbarcode/BC_TwoDimWriter.h"
-#include "xfa/fxbarcode/BC_UtilCodingConvert.h"
-#include "xfa/fxbarcode/BC_Writer.h"
-#include "xfa/fxbarcode/common/BC_CommonBitArray.h"
-#include "xfa/fxbarcode/common/BC_CommonBitMatrix.h"
-#include "xfa/fxbarcode/common/BC_CommonBitMatrix.h"
-#include "xfa/fxbarcode/common/BC_CommonDecoderResult.h"
-#include "xfa/fxbarcode/common/BC_GlobalHistogramBinarizer.h"
-#include "xfa/fxbarcode/datamatrix/BC_DataMatrixReader.h"
-#include "xfa/fxbarcode/datamatrix/BC_DataMatrixWriter.h"
-#include "xfa/fxbarcode/oned/BC_OneDReader.h"
-#include "xfa/fxbarcode/oned/BC_OneDimReader.h"
-#include "xfa/fxbarcode/oned/BC_OneDimWriter.h"
-#include "xfa/fxbarcode/oned/BC_OnedCodaBarReader.h"
-#include "xfa/fxbarcode/oned/BC_OnedCodaBarWriter.h"
-#include "xfa/fxbarcode/oned/BC_OnedCode128Reader.h"
-#include "xfa/fxbarcode/oned/BC_OnedCode128Writer.h"
-#include "xfa/fxbarcode/oned/BC_OnedCode39Reader.h"
-#include "xfa/fxbarcode/oned/BC_OnedCode39Writer.h"
-#include "xfa/fxbarcode/oned/BC_OnedEAN13Reader.h"
-#include "xfa/fxbarcode/oned/BC_OnedEAN13Writer.h"
-#include "xfa/fxbarcode/oned/BC_OnedEAN8Reader.h"
-#include "xfa/fxbarcode/oned/BC_OnedEAN8Writer.h"
-#include "xfa/fxbarcode/oned/BC_OnedUPCAReader.h"
-#include "xfa/fxbarcode/oned/BC_OnedUPCAWriter.h"
-#include "xfa/fxbarcode/pdf417/BC_PDF417.h"
-#include "xfa/fxbarcode/pdf417/BC_PDF417BarcodeMetadata.h"
-#include "xfa/fxbarcode/pdf417/BC_PDF417BarcodeValue.h"
-#include "xfa/fxbarcode/pdf417/BC_PDF417BoundingBox.h"
-#include "xfa/fxbarcode/pdf417/BC_PDF417Codeword.h"
-#include "xfa/fxbarcode/pdf417/BC_PDF417CodewordDecoder.h"
-#include "xfa/fxbarcode/pdf417/BC_PDF417Common.h"
-#include "xfa/fxbarcode/pdf417/BC_PDF417Compaction.h"
-#include "xfa/fxbarcode/pdf417/BC_PDF417DecodedBitStreamParser.h"
-#include "xfa/fxbarcode/pdf417/BC_PDF417DecodedBitStreamParser.h"
-#include "xfa/fxbarcode/pdf417/BC_PDF417DecodedBitStreamParser.h"
-#include "xfa/fxbarcode/pdf417/BC_PDF417DetectionResult.h"
-#include "xfa/fxbarcode/pdf417/BC_PDF417DetectionResultColumn.h"
-#include "xfa/fxbarcode/pdf417/BC_PDF417DetectionResultRowIndicatorColumn.h"
-#include "xfa/fxbarcode/pdf417/BC_PDF417Detector.h"
-#include "xfa/fxbarcode/pdf417/BC_PDF417DetectorResult.h"
-#include "xfa/fxbarcode/pdf417/BC_PDF417DetectorResult.h"
-#include "xfa/fxbarcode/pdf417/BC_PDF417ECErrorCorrection.h"
-#include "xfa/fxbarcode/pdf417/BC_PDF417ECModulusGF.h"
-#include "xfa/fxbarcode/pdf417/BC_PDF417ECModulusPoly.h"
-#include "xfa/fxbarcode/pdf417/BC_PDF417HighLevelEncoder.h"
-#include "xfa/fxbarcode/pdf417/BC_PDF417Reader.h"
-#include "xfa/fxbarcode/pdf417/BC_PDF417ScanningDecoder.h"
-#include "xfa/fxbarcode/pdf417/BC_PDF417Writer.h"
-#include "xfa/fxbarcode/qrcode/BC_QRCodeReader.h"
-#include "xfa/fxbarcode/qrcode/BC_QRCodeWriter.h"
-
-CBC_CodeBase::CBC_CodeBase() {}
-CBC_CodeBase::~CBC_CodeBase() {}
-FX_BOOL CBC_CodeBase::SetCharEncoding(int32_t encoding) {
-  if (m_pBCWriter) {
-    return m_pBCWriter->SetCharEncoding(encoding);
-  }
-  return FALSE;
-}
-FX_BOOL CBC_CodeBase::SetModuleHeight(int32_t moduleHeight) {
-  if (m_pBCWriter) {
-    return m_pBCWriter->SetModuleHeight(moduleHeight);
-  }
-  return FALSE;
-}
-FX_BOOL CBC_CodeBase::SetModuleWidth(int32_t moduleWidth) {
-  if (m_pBCWriter) {
-    return m_pBCWriter->SetModuleWidth(moduleWidth);
-  }
-  return FALSE;
-}
-FX_BOOL CBC_CodeBase::SetHeight(int32_t height) {
-  if (m_pBCWriter) {
-    return m_pBCWriter->SetHeight(height);
-  }
-  return FALSE;
-}
-FX_BOOL CBC_CodeBase::SetWidth(int32_t width) {
-  if (m_pBCWriter) {
-    return m_pBCWriter->SetWidth(width);
-  }
-  return FALSE;
-}
-void CBC_CodeBase::SetBackgroundColor(FX_ARGB backgroundColor) {
-  if (m_pBCWriter) {
-    m_pBCWriter->SetBackgroundColor(backgroundColor);
-  }
-}
-void CBC_CodeBase::SetBarcodeColor(FX_ARGB foregroundColor) {
-  if (m_pBCWriter) {
-    m_pBCWriter->SetBarcodeColor(foregroundColor);
-  }
-}
-CBC_OneCode::CBC_OneCode() {}
-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;
-}
-CFX_WideString CBC_OneCode::FilterContents(const CFX_WideStringC& contents) {
-  CFX_WideString tmp;
-  if (m_pBCWriter == NULL) {
-    return tmp;
-  }
-  return ((CBC_OneDimWriter*)m_pBCWriter)->FilterContents(contents);
-}
-void CBC_OneCode::SetPrintChecksum(FX_BOOL checksum) {
-  if (m_pBCWriter) {
-    ((CBC_OneDimWriter*)m_pBCWriter)->SetPrintChecksum(checksum);
-  }
-}
-void CBC_OneCode::SetDataLength(int32_t length) {
-  if (m_pBCWriter) {
-    ((CBC_OneDimWriter*)m_pBCWriter)->SetDataLength(length);
-  }
-}
-void CBC_OneCode::SetCalChecksum(FX_BOOL calc) {
-  if (m_pBCWriter) {
-    ((CBC_OneDimWriter*)m_pBCWriter)->SetCalcChecksum(calc);
-  }
-}
-FX_BOOL CBC_OneCode::SetFont(CFX_Font* cFont) {
-  if (m_pBCWriter) {
-    return ((CBC_OneDimWriter*)m_pBCWriter)->SetFont(cFont);
-  }
-  return FALSE;
-}
-void CBC_OneCode::SetFontSize(FX_FLOAT size) {
-  if (m_pBCWriter) {
-    ((CBC_OneDimWriter*)m_pBCWriter)->SetFontSize(size);
-  }
-}
-void CBC_OneCode::SetFontStyle(int32_t style) {
-  if (m_pBCWriter) {
-    ((CBC_OneDimWriter*)m_pBCWriter)->SetFontStyle(style);
-  }
-}
-void CBC_OneCode::SetFontColor(FX_ARGB color) {
-  if (m_pBCWriter) {
-    ((CBC_OneDimWriter*)m_pBCWriter)->SetFontColor(color);
-  }
-}
-CBC_Code39::CBC_Code39() {
-  m_pBCReader = (CBC_Reader*)new (CBC_OnedCode39Reader);
-  m_pBCWriter = (CBC_Writer*)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, FX_BOOL extendedMode) {
-  m_pBCReader =
-      (CBC_Reader*)new CBC_OnedCode39Reader(usingCheckDigit, extendedMode);
-  m_pBCWriter = (CBC_Writer*)new CBC_OnedCode39Writer(extendedMode);
-}
-CBC_Code39::~CBC_Code39() {
-  if (m_pBCReader) {
-    delete (m_pBCReader);
-    m_pBCReader = NULL;
-  }
-  if (m_pBCWriter) {
-    delete (m_pBCWriter);
-    m_pBCWriter = NULL;
-  }
-}
-FX_BOOL CBC_Code39::Encode(const CFX_WideStringC& contents,
-                           FX_BOOL isDevice,
-                           int32_t& e) {
-  if (contents.IsEmpty()) {
-    e = BCExceptionNoContents;
-    return FALSE;
-  }
-  BCFORMAT format = BCFORMAT_CODE_39;
-  int32_t outWidth = 0;
-  int32_t outHeight = 0;
-  CFX_WideString filtercontents =
-      ((CBC_OnedCode39Writer*)m_pBCWriter)->FilterContents(contents);
-  CFX_WideString renderContents =
-      ((CBC_OnedCode39Writer*)m_pBCWriter)->RenderTextContents(contents);
-  m_renderContents = renderContents;
-  CFX_ByteString byteString = filtercontents.UTF8Encode();
-  uint8_t* data = static_cast<CBC_OnedCode39Writer*>(m_pBCWriter)
-                      ->Encode(byteString, format, outWidth, outHeight, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
-  ((CBC_OneDimWriter*)m_pBCWriter)
-      ->RenderResult(renderContents, data, outWidth, isDevice, e);
-  FX_Free(data);
-  BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
-  return TRUE;
-}
-FX_BOOL CBC_Code39::RenderDevice(CFX_RenderDevice* device,
-                                 const CFX_Matrix* matirx,
-                                 int32_t& e) {
-  CFX_WideString renderCon = ((CBC_OnedCode39Writer*)m_pBCWriter)
-                                 ->encodedContents(m_renderContents, e);
-  ((CBC_OneDimWriter*)m_pBCWriter)
-      ->RenderDeviceResult(device, matirx, renderCon, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
-  return TRUE;
-}
-FX_BOOL CBC_Code39::RenderBitmap(CFX_DIBitmap*& pOutBitmap, int32_t& e) {
-  CFX_WideString renderCon = ((CBC_OnedCode39Writer*)m_pBCWriter)
-                                 ->encodedContents(m_renderContents, e);
-  ((CBC_OneDimWriter*)m_pBCWriter)
-      ->RenderBitmapResult(pOutBitmap, renderCon, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
-  return TRUE;
-}
-CFX_WideString CBC_Code39::Decode(uint8_t* buf,
-                                  int32_t width,
-                                  int32_t hight,
-                                  int32_t& e) {
-  CFX_WideString str;
-  return str;
-}
-CFX_WideString CBC_Code39::Decode(CFX_DIBitmap* pBitmap, int32_t& e) {
-  CBC_BufferedImageLuminanceSource source(pBitmap);
-  CBC_GlobalHistogramBinarizer binarizer(&source);
-  CBC_BinaryBitmap bitmap(&binarizer);
-  CFX_ByteString str = m_pBCReader->Decode(&bitmap, 0, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, FX_WSTRC(L""));
-  return CFX_WideString::FromUTF8(str, str.GetLength());
-}
-FX_BOOL CBC_Code39::SetTextLocation(BC_TEXT_LOC location) {
-  if (m_pBCWriter) {
-    return ((CBC_OnedCode39Writer*)m_pBCWriter)->SetTextLocation(location);
-  }
-  return FALSE;
-}
-FX_BOOL CBC_Code39::SetWideNarrowRatio(int32_t ratio) {
-  if (m_pBCWriter) {
-    return ((CBC_OnedCode39Writer*)m_pBCWriter)->SetWideNarrowRatio(ratio);
-  }
-  return FALSE;
-}
-CBC_Codabar::CBC_Codabar() {
-  m_pBCReader = (CBC_Reader*)new (CBC_OnedCodaBarReader);
-  m_pBCWriter = (CBC_Writer*)new (CBC_OnedCodaBarWriter);
-}
-CBC_Codabar::~CBC_Codabar() {
-  if (m_pBCReader) {
-    delete (m_pBCReader);
-    m_pBCReader = NULL;
-  }
-  if (m_pBCWriter) {
-    delete (m_pBCWriter);
-    m_pBCWriter = NULL;
-  }
-}
-FX_BOOL CBC_Codabar::SetStartChar(FX_CHAR start) {
-  if (m_pBCWriter) {
-    return ((CBC_OnedCodaBarWriter*)m_pBCWriter)->SetStartChar(start);
-  }
-  return FALSE;
-}
-FX_BOOL CBC_Codabar::SetEndChar(FX_CHAR end) {
-  if (m_pBCWriter) {
-    return ((CBC_OnedCodaBarWriter*)m_pBCWriter)->SetEndChar(end);
-  }
-  return FALSE;
-}
-FX_BOOL CBC_Codabar::SetTextLocation(BC_TEXT_LOC location) {
-  return ((CBC_OnedCodaBarWriter*)m_pBCWriter)->SetTextLocation(location);
-}
-FX_BOOL CBC_Codabar::SetWideNarrowRatio(int32_t ratio) {
-  if (m_pBCWriter) {
-    return ((CBC_OnedCodaBarWriter*)m_pBCWriter)->SetWideNarrowRatio(ratio);
-  }
-  return FALSE;
-}
-FX_BOOL CBC_Codabar::Encode(const CFX_WideStringC& contents,
-                            FX_BOOL isDevice,
-                            int32_t& e) {
-  if (contents.IsEmpty()) {
-    e = BCExceptionNoContents;
-    return FALSE;
-  }
-  BCFORMAT format = BCFORMAT_CODABAR;
-  int32_t outWidth = 0;
-  int32_t outHeight = 0;
-  CFX_WideString filtercontents =
-      ((CBC_OneDimWriter*)m_pBCWriter)->FilterContents(contents);
-  CFX_ByteString byteString = filtercontents.UTF8Encode();
-  m_renderContents = filtercontents;
-  uint8_t* data = static_cast<CBC_OnedCodaBarWriter*>(m_pBCWriter)
-                      ->Encode(byteString, format, outWidth, outHeight, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
-  ((CBC_OneDimWriter*)m_pBCWriter)
-      ->RenderResult(filtercontents, data, outWidth, isDevice, e);
-  FX_Free(data);
-  BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
-  return TRUE;
-}
-FX_BOOL CBC_Codabar::RenderDevice(CFX_RenderDevice* device,
-                                  const CFX_Matrix* matirx,
-                                  int32_t& e) {
-  CFX_WideString renderCon =
-      ((CBC_OnedCodaBarWriter*)m_pBCWriter)->encodedContents(m_renderContents);
-  ((CBC_OneDimWriter*)m_pBCWriter)
-      ->RenderDeviceResult(device, matirx, renderCon, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
-  return TRUE;
-}
-FX_BOOL CBC_Codabar::RenderBitmap(CFX_DIBitmap*& pOutBitmap, int32_t& e) {
-  CFX_WideString renderCon =
-      ((CBC_OnedCodaBarWriter*)m_pBCWriter)->encodedContents(m_renderContents);
-  ((CBC_OneDimWriter*)m_pBCWriter)
-      ->RenderBitmapResult(pOutBitmap, renderCon, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
-  return TRUE;
-}
-CFX_WideString CBC_Codabar::Decode(uint8_t* buf,
-                                   int32_t width,
-                                   int32_t hight,
-                                   int32_t& e) {
-  CFX_WideString str;
-  return str;
-}
-CFX_WideString CBC_Codabar::Decode(CFX_DIBitmap* pBitmap, int32_t& e) {
-  CBC_BufferedImageLuminanceSource source(pBitmap);
-  CBC_GlobalHistogramBinarizer binarizer(&source);
-  CBC_BinaryBitmap bitmap(&binarizer);
-  CFX_ByteString str = m_pBCReader->Decode(&bitmap, 0, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, FX_WSTRC(L""));
-  return CFX_WideString::FromUTF8(str, str.GetLength());
-}
-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() {
-  if (m_pBCReader) {
-    delete (m_pBCReader);
-    m_pBCReader = NULL;
-  }
-  if (m_pBCWriter) {
-    delete (m_pBCWriter);
-    m_pBCWriter = NULL;
-  }
-}
-FX_BOOL CBC_Code128::SetTextLocation(BC_TEXT_LOC location) {
-  if (m_pBCWriter) {
-    return ((CBC_OnedCode128Writer*)m_pBCWriter)->SetTextLocation(location);
-  }
-  return FALSE;
-}
-FX_BOOL CBC_Code128::Encode(const CFX_WideStringC& contents,
-                            FX_BOOL isDevice,
-                            int32_t& e) {
-  if (contents.IsEmpty()) {
-    e = BCExceptionNoContents;
-    return FALSE;
-  }
-  BCFORMAT format = BCFORMAT_CODE_128;
-  int32_t outWidth = 0;
-  int32_t outHeight = 0;
-  CFX_WideString content = contents;
-  if (contents.GetLength() % 2 &&
-      ((CBC_OnedCode128Writer*)m_pBCWriter)->GetType() == BC_CODE128_C) {
-    content += '0';
-  }
-  CFX_WideString encodeContents =
-      ((CBC_OnedCode128Writer*)m_pBCWriter)->FilterContents(content);
-  m_renderContents = encodeContents;
-  CFX_ByteString byteString = encodeContents.UTF8Encode();
-  uint8_t* data = static_cast<CBC_OnedCode128Writer*>(m_pBCWriter)
-                      ->Encode(byteString, format, outWidth, outHeight, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
-  ((CBC_OneDimWriter*)m_pBCWriter)
-      ->RenderResult(encodeContents, data, outWidth, isDevice, e);
-  FX_Free(data);
-  BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
-  return TRUE;
-}
-FX_BOOL CBC_Code128::RenderDevice(CFX_RenderDevice* device,
-                                  const CFX_Matrix* matirx,
-                                  int32_t& e) {
-  ((CBC_OneDimWriter*)m_pBCWriter)
-      ->RenderDeviceResult(device, matirx, m_renderContents, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
-  return TRUE;
-}
-FX_BOOL CBC_Code128::RenderBitmap(CFX_DIBitmap*& pOutBitmap, int32_t& e) {
-  ((CBC_OneDimWriter*)m_pBCWriter)
-      ->RenderBitmapResult(pOutBitmap, m_renderContents, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
-  return TRUE;
-}
-CFX_WideString CBC_Code128::Decode(uint8_t* buf,
-                                   int32_t width,
-                                   int32_t hight,
-                                   int32_t& e) {
-  CFX_WideString str;
-  return str;
-}
-CFX_WideString CBC_Code128::Decode(CFX_DIBitmap* pBitmap, int32_t& e) {
-  CBC_BufferedImageLuminanceSource source(pBitmap);
-  CBC_GlobalHistogramBinarizer binarizer(&source);
-  CBC_BinaryBitmap bitmap(&binarizer);
-  CFX_ByteString str = m_pBCReader->Decode(&bitmap, 0, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, FX_WSTRC(L""));
-  return CFX_WideString::FromUTF8(str, str.GetLength());
-}
-CBC_EAN8::CBC_EAN8() {
-  m_pBCReader = (CBC_Reader*)new (CBC_OnedEAN8Reader);
-  m_pBCWriter = (CBC_Writer*)new (CBC_OnedEAN8Writer);
-}
-CBC_EAN8::~CBC_EAN8() {
-  if (m_pBCReader) {
-    delete (m_pBCReader);
-    m_pBCReader = NULL;
-  }
-  if (m_pBCWriter) {
-    delete (m_pBCWriter);
-    m_pBCWriter = NULL;
-  }
-}
-CFX_WideString CBC_EAN8::Preprocess(const CFX_WideStringC& contents) {
-  CFX_WideString encodeContents =
-      ((CBC_OnedEAN8Writer*)m_pBCWriter)->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);
-    encodeContents += FX_WCHAR(checksum - 0 + '0');
-  }
-  if (length > 8) {
-    encodeContents = encodeContents.Mid(0, 8);
-  }
-  return encodeContents;
-}
-FX_BOOL CBC_EAN8::Encode(const CFX_WideStringC& contents,
-                         FX_BOOL isDevice,
-                         int32_t& e) {
-  if (contents.IsEmpty()) {
-    e = BCExceptionNoContents;
-    return FALSE;
-  }
-  BCFORMAT format = BCFORMAT_EAN_8;
-  int32_t outWidth = 0;
-  int32_t outHeight = 0;
-  CFX_WideString encodeContents = Preprocess(contents);
-  CFX_ByteString byteString = encodeContents.UTF8Encode();
-  m_renderContents = encodeContents;
-  uint8_t* data = static_cast<CBC_OnedEAN8Writer*>(m_pBCWriter)
-                      ->Encode(byteString, format, outWidth, outHeight, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
-  ((CBC_OneDimWriter*)m_pBCWriter)
-      ->RenderResult(encodeContents, data, outWidth, isDevice, e);
-  FX_Free(data);
-  BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
-  return TRUE;
-}
-FX_BOOL CBC_EAN8::RenderDevice(CFX_RenderDevice* device,
-                               const CFX_Matrix* matirx,
-                               int32_t& e) {
-  ((CBC_OneDimWriter*)m_pBCWriter)
-      ->RenderDeviceResult(device, matirx, m_renderContents, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
-  return TRUE;
-}
-FX_BOOL CBC_EAN8::RenderBitmap(CFX_DIBitmap*& pOutBitmap, int32_t& e) {
-  ((CBC_OneDimWriter*)m_pBCWriter)
-      ->RenderBitmapResult(pOutBitmap, m_renderContents, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
-  return TRUE;
-}
-CFX_WideString CBC_EAN8::Decode(uint8_t* buf,
-                                int32_t width,
-                                int32_t hight,
-                                int32_t& e) {
-  CFX_WideString str;
-  return str;
-}
-CFX_WideString CBC_EAN8::Decode(CFX_DIBitmap* pBitmap, int32_t& e) {
-  CBC_BufferedImageLuminanceSource source(pBitmap);
-  CBC_GlobalHistogramBinarizer binarizer(&source);
-  CBC_BinaryBitmap bitmap(&binarizer);
-  CFX_ByteString str = m_pBCReader->Decode(&bitmap, 0, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, FX_WSTRC(L""));
-  return CFX_WideString::FromUTF8(str, str.GetLength());
-}
-CBC_EAN13::CBC_EAN13() {
-  m_pBCReader = (CBC_Reader*)new (CBC_OnedEAN13Reader);
-  m_pBCWriter = (CBC_Writer*)new (CBC_OnedEAN13Writer);
-}
-CBC_EAN13::~CBC_EAN13() {
-  if (m_pBCReader) {
-    delete (m_pBCReader);
-    m_pBCReader = NULL;
-  }
-  if (m_pBCWriter) {
-    delete (m_pBCWriter);
-    m_pBCWriter = NULL;
-  }
-}
-CFX_WideString CBC_EAN13::Preprocess(const CFX_WideStringC& contents) {
-  CFX_WideString encodeContents =
-      ((CBC_OnedEAN8Writer*)m_pBCWriter)->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);
-    byteString += checksum - 0 + '0';
-    encodeContents = byteString.UTF8Decode();
-  }
-  if (length > 13) {
-    encodeContents = encodeContents.Mid(0, 13);
-  }
-  return encodeContents;
-}
-FX_BOOL CBC_EAN13::Encode(const CFX_WideStringC& contents,
-                          FX_BOOL isDevice,
-                          int32_t& e) {
-  if (contents.IsEmpty()) {
-    e = BCExceptionNoContents;
-    return FALSE;
-  }
-  BCFORMAT format = BCFORMAT_EAN_13;
-  int32_t outWidth = 0;
-  int32_t outHeight = 0;
-  CFX_WideString encodeContents = Preprocess(contents);
-  CFX_ByteString byteString = encodeContents.UTF8Encode();
-  m_renderContents = encodeContents;
-  uint8_t* data = static_cast<CBC_OnedEAN13Writer*>(m_pBCWriter)
-                      ->Encode(byteString, format, outWidth, outHeight, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
-  ((CBC_OneDimWriter*)m_pBCWriter)
-      ->RenderResult(encodeContents, data, outWidth, isDevice, e);
-  FX_Free(data);
-  BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
-  return TRUE;
-}
-FX_BOOL CBC_EAN13::RenderDevice(CFX_RenderDevice* device,
-                                const CFX_Matrix* matirx,
-                                int32_t& e) {
-  ((CBC_OneDimWriter*)m_pBCWriter)
-      ->RenderDeviceResult(device, matirx, m_renderContents, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
-  return TRUE;
-}
-FX_BOOL CBC_EAN13::RenderBitmap(CFX_DIBitmap*& pOutBitmap, int32_t& e) {
-  ((CBC_OneDimWriter*)m_pBCWriter)
-      ->RenderBitmapResult(pOutBitmap, m_renderContents, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
-  return TRUE;
-}
-CFX_WideString CBC_EAN13::Decode(uint8_t* buf,
-                                 int32_t width,
-                                 int32_t hight,
-                                 int32_t& e) {
-  CFX_WideString str;
-  return str;
-}
-CFX_WideString CBC_EAN13::Decode(CFX_DIBitmap* pBitmap, int32_t& e) {
-  CBC_BufferedImageLuminanceSource source(pBitmap);
-  CBC_GlobalHistogramBinarizer binarizer(&source);
-  CBC_BinaryBitmap bitmap(&binarizer);
-  CFX_ByteString str = m_pBCReader->Decode(&bitmap, 0, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, FX_WSTRC(L""));
-  return CFX_WideString::FromUTF8(str, str.GetLength());
-}
-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() {
-  if (m_pBCReader) {
-    delete (m_pBCReader);
-    m_pBCReader = NULL;
-  }
-  if (m_pBCWriter) {
-    delete (m_pBCWriter);
-    m_pBCWriter = NULL;
-  }
-}
-CFX_WideString CBC_UPCA::Preprocess(const CFX_WideStringC& contents) {
-  CFX_WideString encodeContents =
-      ((CBC_OnedEAN8Writer*)m_pBCWriter)->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);
-    byteString += checksum - 0 + '0';
-    encodeContents = byteString.UTF8Decode();
-  }
-  if (length > 12) {
-    encodeContents = encodeContents.Mid(0, 12);
-  }
-  return encodeContents;
-}
-FX_BOOL CBC_UPCA::Encode(const CFX_WideStringC& contents,
-                         FX_BOOL isDevice,
-                         int32_t& e) {
-  if (contents.IsEmpty()) {
-    e = BCExceptionNoContents;
-    return FALSE;
-  }
-  BCFORMAT format = BCFORMAT_UPC_A;
-  int32_t outWidth = 0;
-  int32_t outHeight = 0;
-  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);
-  BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
-  ((CBC_OneDimWriter*)m_pBCWriter)
-      ->RenderResult(encodeContents, data, outWidth, isDevice, e);
-  FX_Free(data);
-  BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
-  return TRUE;
-}
-FX_BOOL CBC_UPCA::RenderDevice(CFX_RenderDevice* device,
-                               const CFX_Matrix* matirx,
-                               int32_t& e) {
-  ((CBC_OneDimWriter*)m_pBCWriter)
-      ->RenderDeviceResult(device, matirx, m_renderContents, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
-  return TRUE;
-}
-FX_BOOL CBC_UPCA::RenderBitmap(CFX_DIBitmap*& pOutBitmap, int32_t& e) {
-  ((CBC_OneDimWriter*)m_pBCWriter)
-      ->RenderBitmapResult(pOutBitmap, m_renderContents, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
-  return TRUE;
-}
-CFX_WideString CBC_UPCA::Decode(uint8_t* buf,
-                                int32_t width,
-                                int32_t hight,
-                                int32_t& e) {
-  CFX_WideString str;
-  return str;
-}
-CFX_WideString CBC_UPCA::Decode(CFX_DIBitmap* pBitmap, int32_t& e) {
-  CBC_BufferedImageLuminanceSource source(pBitmap);
-  CBC_GlobalHistogramBinarizer binarizer(&source);
-  CBC_BinaryBitmap bitmap(&binarizer);
-  CFX_ByteString str = m_pBCReader->Decode(&bitmap, 0, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, FX_WSTRC(L""));
-  return CFX_WideString::FromUTF8(str, str.GetLength());
-}
-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() {
-  if (m_pBCReader) {
-    delete (m_pBCReader);
-    m_pBCReader = NULL;
-  }
-  if (m_pBCWriter) {
-    delete (m_pBCWriter);
-    m_pBCWriter = NULL;
-  }
-}
-FX_BOOL CBC_QRCode::SetVersion(int32_t version) {
-  if (version < 0 || version > 40) {
-    return FALSE;
-  }
-  if (m_pBCWriter == NULL) {
-    return FALSE;
-  }
-  return ((CBC_QRCodeWriter*)m_pBCWriter)->SetVersion(version);
-}
-FX_BOOL CBC_QRCode::SetErrorCorrectionLevel(int32_t level) {
-  if (level < 0 || level > 3) {
-    return FALSE;
-  }
-  if (m_pBCWriter == NULL) {
-    return FALSE;
-  }
-  return ((CBC_TwoDimWriter*)m_pBCWriter)->SetErrorCorrectionLevel(level);
-}
-FX_BOOL CBC_QRCode::Encode(const CFX_WideStringC& contents,
-                           FX_BOOL isDevice,
-                           int32_t& e) {
-  int32_t outWidth = 0;
-  int32_t outHeight = 0;
-  uint8_t* data = ((CBC_QRCodeWriter*)m_pBCWriter)
-                      ->Encode(contents, ((CBC_QRCodeWriter*)m_pBCWriter)
-                                             ->GetErrorCorrectionLevel(),
-                               outWidth, outHeight, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
-  ((CBC_TwoDimWriter*)m_pBCWriter)->RenderResult(data, outWidth, outHeight, e);
-  FX_Free(data);
-  BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
-  return TRUE;
-}
-FX_BOOL CBC_QRCode::RenderDevice(CFX_RenderDevice* device,
-                                 const CFX_Matrix* matirx,
-                                 int32_t& e) {
-  ((CBC_TwoDimWriter*)m_pBCWriter)->RenderDeviceResult(device, matirx);
-  return TRUE;
-}
-FX_BOOL CBC_QRCode::RenderBitmap(CFX_DIBitmap*& pOutBitmap, int32_t& e) {
-  ((CBC_TwoDimWriter*)m_pBCWriter)->RenderBitmapResult(pOutBitmap, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
-  return TRUE;
-}
-CFX_WideString CBC_QRCode::Decode(uint8_t* buf,
-                                  int32_t width,
-                                  int32_t hight,
-                                  int32_t& e) {
-  CFX_WideString str;
-  return str;
-}
-CFX_WideString CBC_QRCode::Decode(CFX_DIBitmap* pBitmap, int32_t& e) {
-  CBC_BufferedImageLuminanceSource source(pBitmap);
-  CBC_GlobalHistogramBinarizer binarizer(&source);
-  CBC_BinaryBitmap bitmap(&binarizer);
-  CFX_ByteString retStr = m_pBCReader->Decode(&bitmap, 0, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, FX_WSTRC(L""));
-  return CFX_WideString::FromUTF8(retStr, retStr.GetLength());
-}
-CBC_PDF417I::CBC_PDF417I() {
-  m_pBCReader = (CBC_Reader*)new (CBC_PDF417Reader);
-  m_pBCWriter = (CBC_Writer*)new (CBC_PDF417Writer);
-}
-CBC_PDF417I::~CBC_PDF417I() {
-  if (m_pBCReader) {
-    delete (m_pBCReader);
-    m_pBCReader = NULL;
-  }
-  if (m_pBCWriter) {
-    delete (m_pBCWriter);
-    m_pBCWriter = NULL;
-  }
-}
-FX_BOOL CBC_PDF417I::SetErrorCorrectionLevel(int32_t level) {
-  ((CBC_PDF417Writer*)m_pBCWriter)->SetErrorCorrectionLevel(level);
-  return TRUE;
-}
-void CBC_PDF417I::SetTruncated(FX_BOOL truncated) {
-  ((CBC_PDF417Writer*)m_pBCWriter)->SetTruncated(truncated);
-}
-FX_BOOL CBC_PDF417I::Encode(const CFX_WideStringC& contents,
-                            FX_BOOL isDevice,
-                            int32_t& e) {
-  int32_t outWidth = 0;
-  int32_t outHeight = 0;
-  uint8_t* data = ((CBC_PDF417Writer*)m_pBCWriter)
-                      ->Encode(contents, outWidth, outHeight, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
-  ((CBC_TwoDimWriter*)m_pBCWriter)->RenderResult(data, outWidth, outHeight, e);
-  FX_Free(data);
-  BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
-  return TRUE;
-}
-FX_BOOL CBC_PDF417I::RenderDevice(CFX_RenderDevice* device,
-                                  const CFX_Matrix* matirx,
-                                  int32_t& e) {
-  ((CBC_TwoDimWriter*)m_pBCWriter)->RenderDeviceResult(device, matirx);
-  return TRUE;
-}
-FX_BOOL CBC_PDF417I::RenderBitmap(CFX_DIBitmap*& pOutBitmap, int32_t& e) {
-  ((CBC_TwoDimWriter*)m_pBCWriter)->RenderBitmapResult(pOutBitmap, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
-  return TRUE;
-}
-CFX_WideString CBC_PDF417I::Decode(uint8_t* buf,
-                                   int32_t width,
-                                   int32_t hight,
-                                   int32_t& e) {
-  CFX_WideString str;
-  return str;
-}
-CFX_WideString CBC_PDF417I::Decode(CFX_DIBitmap* pBitmap, int32_t& e) {
-  CBC_BufferedImageLuminanceSource source(pBitmap);
-  CBC_GlobalHistogramBinarizer binarizer(&source);
-  CBC_BinaryBitmap bitmap(&binarizer);
-  CFX_ByteString bytestring = m_pBCReader->Decode(&bitmap, 0, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, FX_WSTRC(L""));
-  return CFX_WideString::FromUTF8(bytestring, bytestring.GetLength());
-}
-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() {
-  if (m_pBCReader) {
-    delete (m_pBCReader);
-    m_pBCReader = NULL;
-  }
-  if (m_pBCWriter) {
-    delete (m_pBCWriter);
-    m_pBCWriter = NULL;
-  }
-}
-FX_BOOL CBC_DataMatrix::Encode(const CFX_WideStringC& contents,
-                               FX_BOOL isDevice,
-                               int32_t& e) {
-  int32_t outWidth = 0;
-  int32_t outHeight = 0;
-  uint8_t* data = ((CBC_DataMatrixWriter*)m_pBCWriter)
-                      ->Encode(contents, outWidth, outHeight, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
-  ((CBC_TwoDimWriter*)m_pBCWriter)->RenderResult(data, outWidth, outHeight, e);
-  FX_Free(data);
-  BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
-  return TRUE;
-}
-FX_BOOL CBC_DataMatrix::RenderDevice(CFX_RenderDevice* device,
-                                     const CFX_Matrix* matirx,
-                                     int32_t& e) {
-  ((CBC_TwoDimWriter*)m_pBCWriter)->RenderDeviceResult(device, matirx);
-  return TRUE;
-}
-FX_BOOL CBC_DataMatrix::RenderBitmap(CFX_DIBitmap*& pOutBitmap, int32_t& e) {
-  ((CBC_TwoDimWriter*)m_pBCWriter)->RenderBitmapResult(pOutBitmap, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
-  return TRUE;
-}
-CFX_WideString CBC_DataMatrix::Decode(uint8_t* buf,
-                                      int32_t width,
-                                      int32_t hight,
-                                      int32_t& e) {
-  CFX_WideString str;
-  return str;
-}
-CFX_WideString CBC_DataMatrix::Decode(CFX_DIBitmap* pBitmap, int32_t& e) {
-  CBC_BufferedImageLuminanceSource source(pBitmap);
-  CBC_GlobalHistogramBinarizer binarizer(&source);
-  CBC_BinaryBitmap bitmap(&binarizer);
-  CFX_ByteString retStr = m_pBCReader->Decode(&bitmap, 0, e);
-  BC_EXCEPTION_CHECK_ReturnValue(e, FX_WSTRC(L""));
-  return CFX_WideString::FromUTF8(retStr, retStr.GetLength());
-}
diff --git a/xfa/fxbarcode/BC_Library.cpp b/xfa/fxbarcode/BC_Library.cpp
index d6da15c..311dd51 100644
--- a/xfa/fxbarcode/BC_Library.cpp
+++ b/xfa/fxbarcode/BC_Library.cpp
@@ -4,87 +4,22 @@
 
 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
 
-#include "xfa/fxbarcode/BC_Binarizer.h"
-#include "xfa/fxbarcode/BC_BinaryBitmap.h"
-#include "xfa/fxbarcode/BC_BinaryBitmap.h"
-#include "xfa/fxbarcode/BC_BufferedImageLuminanceSource.h"
-#include "xfa/fxbarcode/BC_DecoderResult.h"
-#include "xfa/fxbarcode/BC_Dimension.h"
-#include "xfa/fxbarcode/BC_LuminanceSource.h"
-#include "xfa/fxbarcode/BC_Reader.h"
-#include "xfa/fxbarcode/BC_ResultPoint.h"
-#include "xfa/fxbarcode/BC_TwoDimWriter.h"
-#include "xfa/fxbarcode/BC_UtilCodingConvert.h"
-#include "xfa/fxbarcode/BC_UtilCodingConvert.h"
-#include "xfa/fxbarcode/BC_Writer.h"
-#include "xfa/fxbarcode/common/BC_CommonBitArray.h"
-#include "xfa/fxbarcode/common/BC_CommonBitMatrix.h"
-#include "xfa/fxbarcode/common/BC_CommonBitMatrix.h"
-#include "xfa/fxbarcode/common/BC_CommonBitMatrix.h"
-#include "xfa/fxbarcode/common/BC_CommonByteMatrix.h"
-#include "xfa/fxbarcode/common/BC_CommonDecoderResult.h"
-#include "xfa/fxbarcode/common/BC_GlobalHistogramBinarizer.h"
+#include <stdint.h>
+
 #include "xfa/fxbarcode/common/reedsolomon/BC_ReedSolomonGF256.h"
-#include "xfa/fxbarcode/datamatrix/BC_ASCIIEncoder.h"
-#include "xfa/fxbarcode/datamatrix/BC_Base256Encoder.h"
-#include "xfa/fxbarcode/datamatrix/BC_C40Encoder.h"
-#include "xfa/fxbarcode/datamatrix/BC_DataMatrixReader.h"
-#include "xfa/fxbarcode/datamatrix/BC_DataMatrixSymbolInfo144.h"
 #include "xfa/fxbarcode/datamatrix/BC_DataMatrixVersion.h"
-#include "xfa/fxbarcode/datamatrix/BC_DataMatrixWriter.h"
-#include "xfa/fxbarcode/datamatrix/BC_DefaultPlacement.h"
-#include "xfa/fxbarcode/datamatrix/BC_EdifactEncoder.h"
-#include "xfa/fxbarcode/datamatrix/BC_Encoder.h"
-#include "xfa/fxbarcode/datamatrix/BC_EncoderContext.h"
 #include "xfa/fxbarcode/datamatrix/BC_ErrorCorrection.h"
-#include "xfa/fxbarcode/datamatrix/BC_HighLevelEncoder.h"
 #include "xfa/fxbarcode/datamatrix/BC_SymbolInfo.h"
-#include "xfa/fxbarcode/datamatrix/BC_SymbolShapeHint.h"
-#include "xfa/fxbarcode/datamatrix/BC_TextEncoder.h"
-#include "xfa/fxbarcode/datamatrix/BC_X12Encoder.h"
-#include "xfa/fxbarcode/oned/BC_OneDReader.h"
-#include "xfa/fxbarcode/oned/BC_OneDimReader.h"
-#include "xfa/fxbarcode/oned/BC_OneDimWriter.h"
-#include "xfa/fxbarcode/oned/BC_OnedCodaBarReader.h"
-#include "xfa/fxbarcode/oned/BC_OnedCode128Reader.h"
-#include "xfa/fxbarcode/oned/BC_OnedCode128Writer.h"
-#include "xfa/fxbarcode/oned/BC_OnedCode39Reader.h"
-#include "xfa/fxbarcode/oned/BC_OnedCode39Writer.h"
-#include "xfa/fxbarcode/oned/BC_OnedEAN13Reader.h"
-#include "xfa/fxbarcode/oned/BC_OnedEAN13Writer.h"
-#include "xfa/fxbarcode/oned/BC_OnedEAN8Reader.h"
-#include "xfa/fxbarcode/oned/BC_OnedEAN8Writer.h"
-#include "xfa/fxbarcode/oned/BC_OnedUPCAReader.h"
-#include "xfa/fxbarcode/oned/BC_OnedUPCAWriter.h"
-#include "xfa/fxbarcode/pdf417/BC_PDF417BarcodeMetadata.h"
-#include "xfa/fxbarcode/pdf417/BC_PDF417BarcodeValue.h"
-#include "xfa/fxbarcode/pdf417/BC_PDF417BoundingBox.h"
-#include "xfa/fxbarcode/pdf417/BC_PDF417Codeword.h"
 #include "xfa/fxbarcode/pdf417/BC_PDF417CodewordDecoder.h"
-#include "xfa/fxbarcode/pdf417/BC_PDF417Common.h"
-#include "xfa/fxbarcode/pdf417/BC_PDF417Compaction.h"
 #include "xfa/fxbarcode/pdf417/BC_PDF417DecodedBitStreamParser.h"
-#include "xfa/fxbarcode/pdf417/BC_PDF417DecodedBitStreamParser.h"
-#include "xfa/fxbarcode/pdf417/BC_PDF417DecodedBitStreamParser.h"
-#include "xfa/fxbarcode/pdf417/BC_PDF417DetectionResult.h"
-#include "xfa/fxbarcode/pdf417/BC_PDF417DetectionResultColumn.h"
-#include "xfa/fxbarcode/pdf417/BC_PDF417DetectionResultRowIndicatorColumn.h"
-#include "xfa/fxbarcode/pdf417/BC_PDF417Detector.h"
-#include "xfa/fxbarcode/pdf417/BC_PDF417DetectorResult.h"
-#include "xfa/fxbarcode/pdf417/BC_PDF417DetectorResult.h"
 #include "xfa/fxbarcode/pdf417/BC_PDF417ECErrorCorrection.h"
 #include "xfa/fxbarcode/pdf417/BC_PDF417ECModulusGF.h"
-#include "xfa/fxbarcode/pdf417/BC_PDF417ECModulusPoly.h"
 #include "xfa/fxbarcode/pdf417/BC_PDF417HighLevelEncoder.h"
-#include "xfa/fxbarcode/pdf417/BC_PDF417Reader.h"
 #include "xfa/fxbarcode/pdf417/BC_PDF417ScanningDecoder.h"
-#include "xfa/fxbarcode/qrcode/BC_QRCodeReader.h"
-#include "xfa/fxbarcode/qrcode/BC_QRCodeWriter.h"
 #include "xfa/fxbarcode/qrcode/BC_QRCoderErrorCorrectionLevel.h"
 #include "xfa/fxbarcode/qrcode/BC_QRCoderMode.h"
 #include "xfa/fxbarcode/qrcode/BC_QRCoderVersion.h"
 #include "xfa/fxbarcode/qrcode/BC_QRDataMask.h"
-#include "xfa/fxbarcode/qrcode/BC_QRDecodedBitStreamParser.h"
 
 void BC_Library_Init() {
   CBC_QRCoderErrorCorrectionLevel::Initialize();
@@ -96,6 +31,7 @@
   CBC_SymbolInfo::Initialize();
   CBC_ErrorCorrection::Initialize();
   CBC_PDF417HighLevelEncoder::Initialize();
+
   int32_t e = 0;
   CBC_PDF417ECModulusGF::Initialize(e);
   CBC_DecodedBitStreamPaser::Initialize();
diff --git a/xfa/fxbarcode/cbc_codabar.cpp b/xfa/fxbarcode/cbc_codabar.cpp
new file mode 100644
index 0000000..a7310ba
--- /dev/null
+++ b/xfa/fxbarcode/cbc_codabar.cpp
@@ -0,0 +1,121 @@
+// Copyright 2016 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
+/*
+ * Copyright 2011 ZXing authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "xfa/fxbarcode/cbc_codabar.h"
+
+#include "xfa/fxbarcode/BC_BinaryBitmap.h"
+#include "xfa/fxbarcode/BC_BufferedImageLuminanceSource.h"
+#include "xfa/fxbarcode/common/BC_GlobalHistogramBinarizer.h"
+#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() {
+  delete (m_pBCReader);
+  delete (m_pBCWriter);
+}
+
+FX_BOOL CBC_Codabar::SetStartChar(FX_CHAR start) {
+  if (m_pBCWriter)
+    return ((CBC_OnedCodaBarWriter*)m_pBCWriter)->SetStartChar(start);
+  return FALSE;
+}
+
+FX_BOOL CBC_Codabar::SetEndChar(FX_CHAR end) {
+  if (m_pBCWriter)
+    return ((CBC_OnedCodaBarWriter*)m_pBCWriter)->SetEndChar(end);
+  return FALSE;
+}
+
+FX_BOOL CBC_Codabar::SetTextLocation(BC_TEXT_LOC location) {
+  return ((CBC_OnedCodaBarWriter*)m_pBCWriter)->SetTextLocation(location);
+}
+
+FX_BOOL CBC_Codabar::SetWideNarrowRatio(int32_t ratio) {
+  if (m_pBCWriter)
+    return ((CBC_OnedCodaBarWriter*)m_pBCWriter)->SetWideNarrowRatio(ratio);
+  return FALSE;
+}
+
+FX_BOOL CBC_Codabar::Encode(const CFX_WideStringC& contents,
+                            FX_BOOL isDevice,
+                            int32_t& e) {
+  if (contents.IsEmpty()) {
+    e = BCExceptionNoContents;
+    return FALSE;
+  }
+  BCFORMAT format = BCFORMAT_CODABAR;
+  int32_t outWidth = 0;
+  int32_t outHeight = 0;
+  CFX_WideString filtercontents =
+      ((CBC_OneDimWriter*)m_pBCWriter)->FilterContents(contents);
+  CFX_ByteString byteString = filtercontents.UTF8Encode();
+  m_renderContents = filtercontents;
+  uint8_t* data = static_cast<CBC_OnedCodaBarWriter*>(m_pBCWriter)
+                      ->Encode(byteString, format, outWidth, outHeight, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
+  ((CBC_OneDimWriter*)m_pBCWriter)
+      ->RenderResult(filtercontents, data, outWidth, isDevice, e);
+  FX_Free(data);
+  BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
+  return TRUE;
+}
+
+FX_BOOL CBC_Codabar::RenderDevice(CFX_RenderDevice* device,
+                                  const CFX_Matrix* matirx,
+                                  int32_t& e) {
+  CFX_WideString renderCon =
+      ((CBC_OnedCodaBarWriter*)m_pBCWriter)->encodedContents(m_renderContents);
+  ((CBC_OneDimWriter*)m_pBCWriter)
+      ->RenderDeviceResult(device, matirx, renderCon, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
+  return TRUE;
+}
+
+FX_BOOL CBC_Codabar::RenderBitmap(CFX_DIBitmap*& pOutBitmap, int32_t& e) {
+  CFX_WideString renderCon =
+      ((CBC_OnedCodaBarWriter*)m_pBCWriter)->encodedContents(m_renderContents);
+  ((CBC_OneDimWriter*)m_pBCWriter)
+      ->RenderBitmapResult(pOutBitmap, renderCon, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
+  return TRUE;
+}
+
+CFX_WideString CBC_Codabar::Decode(uint8_t* buf,
+                                   int32_t width,
+                                   int32_t hight,
+                                   int32_t& e) {
+  CFX_WideString str;
+  return str;
+}
+
+CFX_WideString CBC_Codabar::Decode(CFX_DIBitmap* pBitmap, int32_t& e) {
+  CBC_BufferedImageLuminanceSource source(pBitmap);
+  CBC_GlobalHistogramBinarizer binarizer(&source);
+  CBC_BinaryBitmap bitmap(&binarizer);
+  CFX_ByteString str = m_pBCReader->Decode(&bitmap, 0, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, FX_WSTRC(L""));
+  return CFX_WideString::FromUTF8(str, str.GetLength());
+}
diff --git a/xfa/fxbarcode/cbc_codabar.h b/xfa/fxbarcode/cbc_codabar.h
new file mode 100644
index 0000000..8da2383
--- /dev/null
+++ b/xfa/fxbarcode/cbc_codabar.h
@@ -0,0 +1,40 @@
+// Copyright 2016 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 XFA_FXBARCODE_CBC_CODABAR_H_
+#define XFA_FXBARCODE_CBC_CODABAR_H_
+
+#include "core/include/fxcrt/fx_coordinates.h"
+#include "core/include/fxcrt/fx_system.h"
+#include "core/include/fxge/fx_dib.h"
+#include "xfa/fxbarcode/cbc_onecode.h"
+
+class CBC_Codabar : public CBC_OneCode {
+ public:
+  CBC_Codabar();
+  ~CBC_Codabar() override;
+
+  FX_BOOL Encode(const CFX_WideStringC& contents, FX_BOOL isDevice, int32_t& e) override;
+  CFX_WideString Decode(uint8_t* buf, int32_t width, int32_t hight, int32_t& e) override;
+  CFX_WideString Decode(CFX_DIBitmap* pBitmap, int32_t& e) override;
+
+  FX_BOOL RenderDevice(CFX_RenderDevice* device,
+                       const CFX_Matrix* matirx,
+                       int32_t& e) override;
+  FX_BOOL RenderBitmap(CFX_DIBitmap*& pOutBitmap, int32_t& e) override;
+
+  BC_TYPE GetType() override { return BC_CODABAR; }
+
+  FX_BOOL SetStartChar(FX_CHAR start);
+  FX_BOOL SetEndChar(FX_CHAR end);
+  FX_BOOL SetTextLocation(BC_TEXT_LOC location);
+  FX_BOOL SetWideNarrowRatio(int32_t ratio);
+
+ private:
+  CFX_WideString m_renderContents;
+};
+
+#endif  // XFA_FXBARCODE_CBC_CODABAR_H_
diff --git a/xfa/fxbarcode/cbc_code128.cpp b/xfa/fxbarcode/cbc_code128.cpp
new file mode 100644
index 0000000..e585de3
--- /dev/null
+++ b/xfa/fxbarcode/cbc_code128.cpp
@@ -0,0 +1,106 @@
+// Copyright 2016 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
+/*
+ * Copyright 2011 ZXing authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "xfa/fxbarcode/cbc_code128.h"
+
+#include "xfa/fxbarcode/BC_BinaryBitmap.h"
+#include "xfa/fxbarcode/BC_BufferedImageLuminanceSource.h"
+#include "xfa/fxbarcode/common/BC_GlobalHistogramBinarizer.h"
+#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() {
+  delete (m_pBCReader);
+  delete (m_pBCWriter);
+}
+
+FX_BOOL CBC_Code128::SetTextLocation(BC_TEXT_LOC location) {
+  if (m_pBCWriter)
+    return ((CBC_OnedCode128Writer*)m_pBCWriter)->SetTextLocation(location);
+  return FALSE;
+}
+
+FX_BOOL CBC_Code128::Encode(const CFX_WideStringC& contents,
+                            FX_BOOL isDevice,
+                            int32_t& e) {
+  if (contents.IsEmpty()) {
+    e = BCExceptionNoContents;
+    return FALSE;
+  }
+  BCFORMAT format = BCFORMAT_CODE_128;
+  int32_t outWidth = 0;
+  int32_t outHeight = 0;
+  CFX_WideString content = contents;
+  if (contents.GetLength() % 2 &&
+      ((CBC_OnedCode128Writer*)m_pBCWriter)->GetType() == BC_CODE128_C) {
+    content += '0';
+  }
+  CFX_WideString encodeContents =
+      ((CBC_OnedCode128Writer*)m_pBCWriter)->FilterContents(content);
+  m_renderContents = encodeContents;
+  CFX_ByteString byteString = encodeContents.UTF8Encode();
+  uint8_t* data = static_cast<CBC_OnedCode128Writer*>(m_pBCWriter)
+                      ->Encode(byteString, format, outWidth, outHeight, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
+  ((CBC_OneDimWriter*)m_pBCWriter)
+      ->RenderResult(encodeContents, data, outWidth, isDevice, e);
+  FX_Free(data);
+  BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
+  return TRUE;
+}
+
+FX_BOOL CBC_Code128::RenderDevice(CFX_RenderDevice* device,
+                                  const CFX_Matrix* matirx,
+                                  int32_t& e) {
+  ((CBC_OneDimWriter*)m_pBCWriter)
+      ->RenderDeviceResult(device, matirx, m_renderContents, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
+  return TRUE;
+}
+
+FX_BOOL CBC_Code128::RenderBitmap(CFX_DIBitmap*& pOutBitmap, int32_t& e) {
+  ((CBC_OneDimWriter*)m_pBCWriter)
+      ->RenderBitmapResult(pOutBitmap, m_renderContents, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
+  return TRUE;
+}
+
+CFX_WideString CBC_Code128::Decode(uint8_t* buf,
+                                   int32_t width,
+                                   int32_t hight,
+                                   int32_t& e) {
+  CFX_WideString str;
+  return str;
+}
+
+CFX_WideString CBC_Code128::Decode(CFX_DIBitmap* pBitmap, int32_t& e) {
+  CBC_BufferedImageLuminanceSource source(pBitmap);
+  CBC_GlobalHistogramBinarizer binarizer(&source);
+  CBC_BinaryBitmap bitmap(&binarizer);
+  CFX_ByteString str = m_pBCReader->Decode(&bitmap, 0, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, FX_WSTRC(L""));
+  return CFX_WideString::FromUTF8(str, str.GetLength());
+}
diff --git a/xfa/fxbarcode/cbc_code128.h b/xfa/fxbarcode/cbc_code128.h
new file mode 100644
index 0000000..3f12e1b
--- /dev/null
+++ b/xfa/fxbarcode/cbc_code128.h
@@ -0,0 +1,37 @@
+// Copyright 2016 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 XFA_FXBARCODE_CBC_CODE128_H_
+#define XFA_FXBARCODE_CBC_CODE128_H_
+
+#include "core/include/fxcrt/fx_coordinates.h"
+#include "core/include/fxcrt/fx_system.h"
+#include "core/include/fxge/fx_dib.h"
+#include "xfa/fxbarcode/cbc_onecode.h"
+
+class CBC_Code128 : public CBC_OneCode {
+ public:
+  explicit CBC_Code128(BC_TYPE type);
+  virtual ~CBC_Code128();
+
+  FX_BOOL Encode(const CFX_WideStringC& contents, FX_BOOL isDevice, int32_t& e) override;
+  CFX_WideString Decode(uint8_t* buf, int32_t width, int32_t hight, int32_t& e) override;
+  CFX_WideString Decode(CFX_DIBitmap* pBitmap, int32_t& e) override;
+
+  FX_BOOL RenderDevice(CFX_RenderDevice* device,
+                       const CFX_Matrix* matirx,
+                       int32_t& e) override;
+  FX_BOOL RenderBitmap(CFX_DIBitmap*& pOutBitmap, int32_t& e) override;
+
+  BC_TYPE GetType() override { return BC_CODE128; }
+
+  FX_BOOL SetTextLocation(BC_TEXT_LOC loction);
+
+ private:
+  CFX_WideString m_renderContents;
+};
+
+#endif  // XFA_FXBARCODE_CBC_CODE128_H_
diff --git a/xfa/fxbarcode/cbc_code39.cpp b/xfa/fxbarcode/cbc_code39.cpp
new file mode 100644
index 0000000..a0e3d17
--- /dev/null
+++ b/xfa/fxbarcode/cbc_code39.cpp
@@ -0,0 +1,124 @@
+// Copyright 2016 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
+/*
+ * Copyright 2011 ZXing authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "xfa/fxbarcode/cbc_code39.h"
+
+#include "xfa/fxbarcode/BC_BinaryBitmap.h"
+#include "xfa/fxbarcode/BC_BufferedImageLuminanceSource.h"
+#include "xfa/fxbarcode/common/BC_GlobalHistogramBinarizer.h"
+#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(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, FX_BOOL extendedMode) {
+  m_pBCReader =
+      (CBC_Reader*)new CBC_OnedCode39Reader(usingCheckDigit, extendedMode);
+  m_pBCWriter = (CBC_Writer*)new CBC_OnedCode39Writer(extendedMode);
+}
+
+CBC_Code39::~CBC_Code39() {
+  delete (m_pBCReader);
+  delete (m_pBCWriter);
+}
+
+FX_BOOL CBC_Code39::Encode(const CFX_WideStringC& contents,
+                           FX_BOOL isDevice,
+                           int32_t& e) {
+  if (contents.IsEmpty()) {
+    e = BCExceptionNoContents;
+    return FALSE;
+  }
+  BCFORMAT format = BCFORMAT_CODE_39;
+  int32_t outWidth = 0;
+  int32_t outHeight = 0;
+  CFX_WideString filtercontents =
+      ((CBC_OnedCode39Writer*)m_pBCWriter)->FilterContents(contents);
+  CFX_WideString renderContents =
+      ((CBC_OnedCode39Writer*)m_pBCWriter)->RenderTextContents(contents);
+  m_renderContents = renderContents;
+  CFX_ByteString byteString = filtercontents.UTF8Encode();
+  uint8_t* data = static_cast<CBC_OnedCode39Writer*>(m_pBCWriter)
+                      ->Encode(byteString, format, outWidth, outHeight, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
+  ((CBC_OneDimWriter*)m_pBCWriter)
+      ->RenderResult(renderContents, data, outWidth, isDevice, e);
+  FX_Free(data);
+  BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
+  return TRUE;
+}
+
+FX_BOOL CBC_Code39::RenderDevice(CFX_RenderDevice* device,
+                                 const CFX_Matrix* matirx,
+                                 int32_t& e) {
+  CFX_WideString renderCon = ((CBC_OnedCode39Writer*)m_pBCWriter)
+                                 ->encodedContents(m_renderContents, e);
+  ((CBC_OneDimWriter*)m_pBCWriter)
+      ->RenderDeviceResult(device, matirx, renderCon, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
+  return TRUE;
+}
+
+FX_BOOL CBC_Code39::RenderBitmap(CFX_DIBitmap*& pOutBitmap, int32_t& e) {
+  CFX_WideString renderCon = ((CBC_OnedCode39Writer*)m_pBCWriter)
+                                 ->encodedContents(m_renderContents, e);
+  ((CBC_OneDimWriter*)m_pBCWriter)
+      ->RenderBitmapResult(pOutBitmap, renderCon, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
+  return TRUE;
+}
+
+CFX_WideString CBC_Code39::Decode(uint8_t* buf,
+                                  int32_t width,
+                                  int32_t hight,
+                                  int32_t& e) {
+  CFX_WideString str;
+  return str;
+}
+
+CFX_WideString CBC_Code39::Decode(CFX_DIBitmap* pBitmap, int32_t& e) {
+  CBC_BufferedImageLuminanceSource source(pBitmap);
+  CBC_GlobalHistogramBinarizer binarizer(&source);
+  CBC_BinaryBitmap bitmap(&binarizer);
+  CFX_ByteString str = m_pBCReader->Decode(&bitmap, 0, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, FX_WSTRC(L""));
+  return CFX_WideString::FromUTF8(str, str.GetLength());
+}
+
+FX_BOOL CBC_Code39::SetTextLocation(BC_TEXT_LOC location) {
+  if (m_pBCWriter)
+    return ((CBC_OnedCode39Writer*)m_pBCWriter)->SetTextLocation(location);
+  return FALSE;
+}
+
+FX_BOOL CBC_Code39::SetWideNarrowRatio(int32_t ratio) {
+  if (m_pBCWriter)
+    return ((CBC_OnedCode39Writer*)m_pBCWriter)->SetWideNarrowRatio(ratio);
+  return FALSE;
+}
diff --git a/xfa/fxbarcode/cbc_code39.h b/xfa/fxbarcode/cbc_code39.h
new file mode 100644
index 0000000..9e29665
--- /dev/null
+++ b/xfa/fxbarcode/cbc_code39.h
@@ -0,0 +1,39 @@
+// Copyright 2016 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 XFA_FXBARCODE_CBC_CODE39_H_
+#define XFA_FXBARCODE_CBC_CODE39_H_
+
+#include "core/include/fxcrt/fx_string.h"
+#include "core/include/fxcrt/fx_system.h"
+#include "core/include/fxge/fx_dib.h"
+#include "xfa/fxbarcode/cbc_onecode.h"
+
+class CBC_Code39 : public CBC_OneCode {
+ public:
+  CBC_Code39();
+  explicit CBC_Code39(FX_BOOL usingCheckDigit);
+  CBC_Code39(FX_BOOL usingCheckDigit, FX_BOOL extendedMode);
+  virtual ~CBC_Code39();
+
+  FX_BOOL Encode(const CFX_WideStringC& contents, FX_BOOL isDevice, int32_t& e);
+  CFX_WideString Decode(uint8_t* buf, int32_t width, int32_t hight, int32_t& e);
+  CFX_WideString Decode(CFX_DIBitmap* pBitmap, int32_t& e);
+
+  FX_BOOL RenderDevice(CFX_RenderDevice* device,
+                       const CFX_Matrix* matirx,
+                       int32_t& e);
+  FX_BOOL RenderBitmap(CFX_DIBitmap*& pOutBitmap, int32_t& e);
+
+  BC_TYPE GetType() { return BC_CODE39; }
+  FX_BOOL SetTextLocation(BC_TEXT_LOC location);
+  FX_BOOL SetWideNarrowRatio(int32_t ratio);
+
+ private:
+  CFX_WideString m_renderContents;
+};
+
+#endif  // XFA_FXBARCODE_CBC_CODE39_H_
diff --git a/xfa/fxbarcode/cbc_codebase.cpp b/xfa/fxbarcode/cbc_codebase.cpp
new file mode 100644
index 0000000..64a358a
--- /dev/null
+++ b/xfa/fxbarcode/cbc_codebase.cpp
@@ -0,0 +1,58 @@
+// Copyright 2016 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
+/*
+ * Copyright 2011 ZXing authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "xfa/fxbarcode/cbc_codebase.h"
+
+#include "xfa/fxbarcode/BC_Writer.h"
+
+CBC_CodeBase::CBC_CodeBase() {}
+
+CBC_CodeBase::~CBC_CodeBase() {}
+
+FX_BOOL CBC_CodeBase::SetCharEncoding(int32_t encoding) {
+  return m_pBCWriter && m_pBCWriter->SetCharEncoding(encoding);
+}
+
+FX_BOOL CBC_CodeBase::SetModuleHeight(int32_t moduleHeight) {
+  return m_pBCWriter && m_pBCWriter->SetModuleHeight(moduleHeight);
+}
+
+FX_BOOL CBC_CodeBase::SetModuleWidth(int32_t moduleWidth) {
+  return m_pBCWriter && m_pBCWriter->SetModuleWidth(moduleWidth);
+}
+
+FX_BOOL CBC_CodeBase::SetHeight(int32_t height) {
+  return m_pBCWriter && m_pBCWriter->SetHeight(height);
+}
+
+FX_BOOL CBC_CodeBase::SetWidth(int32_t width) {
+  return m_pBCWriter && m_pBCWriter->SetWidth(width);
+}
+
+void CBC_CodeBase::SetBackgroundColor(FX_ARGB backgroundColor) {
+  if (m_pBCWriter)
+    m_pBCWriter->SetBackgroundColor(backgroundColor);
+}
+
+void CBC_CodeBase::SetBarcodeColor(FX_ARGB foregroundColor) {
+  if (m_pBCWriter)
+    m_pBCWriter->SetBarcodeColor(foregroundColor);
+}
diff --git a/xfa/fxbarcode/cbc_codebase.h b/xfa/fxbarcode/cbc_codebase.h
new file mode 100644
index 0000000..20f25b5
--- /dev/null
+++ b/xfa/fxbarcode/cbc_codebase.h
@@ -0,0 +1,52 @@
+// Copyright 2016 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 XFA_FXBARCODE_CBC_CODEBASE_H_
+#define XFA_FXBARCODE_CBC_CODEBASE_H_
+
+#include "core/include/fxcrt/fx_system.h"
+#include "core/include/fxge/fx_dib.h"
+#include "xfa/fxbarcode/include/BC_Library.h"
+
+class CBC_Writer;
+class CBC_Reader;
+class CFX_DIBitmap;
+class CFX_RenderDevice;
+
+class CBC_CodeBase {
+ public:
+  CBC_CodeBase();
+  virtual ~CBC_CodeBase();
+
+  virtual BC_TYPE GetType() = 0;
+  virtual FX_BOOL Encode(const CFX_WideStringC& contents,
+                         FX_BOOL isDevice,
+                         int32_t& e) = 0;
+  virtual FX_BOOL RenderDevice(CFX_RenderDevice* device,
+                               const CFX_Matrix* matirx,
+                               int32_t& e) = 0;
+  virtual FX_BOOL RenderBitmap(CFX_DIBitmap*& pOutBitmap, int32_t& e) = 0;
+  virtual CFX_WideString Decode(uint8_t* buf,
+                                int32_t width,
+                                int32_t hight,
+                                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);
+
+ protected:
+  CBC_Writer* m_pBCWriter;
+  CBC_Reader* m_pBCReader;
+};
+
+#endif  // XFA_FXBARCODE_CBC_CODEBASE_H_
diff --git a/xfa/fxbarcode/cbc_datamatrix.cpp b/xfa/fxbarcode/cbc_datamatrix.cpp
new file mode 100644
index 0000000..d3e1a07
--- /dev/null
+++ b/xfa/fxbarcode/cbc_datamatrix.cpp
@@ -0,0 +1,83 @@
+// Copyright 2016 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
+/*
+ * Copyright 2011 ZXing authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "xfa/fxbarcode/cbc_datamatrix.h"
+
+#include "xfa/fxbarcode/BC_BinaryBitmap.h"
+#include "xfa/fxbarcode/BC_BufferedImageLuminanceSource.h"
+#include "xfa/fxbarcode/common/BC_GlobalHistogramBinarizer.h"
+#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() {
+  delete (m_pBCReader);
+  delete (m_pBCWriter);
+}
+
+FX_BOOL CBC_DataMatrix::Encode(const CFX_WideStringC& contents,
+                               FX_BOOL isDevice,
+                               int32_t& e) {
+  int32_t outWidth = 0;
+  int32_t outHeight = 0;
+  uint8_t* data = ((CBC_DataMatrixWriter*)m_pBCWriter)
+                      ->Encode(contents, outWidth, outHeight, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
+  ((CBC_TwoDimWriter*)m_pBCWriter)->RenderResult(data, outWidth, outHeight, e);
+  FX_Free(data);
+  BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
+  return TRUE;
+}
+
+FX_BOOL CBC_DataMatrix::RenderDevice(CFX_RenderDevice* device,
+                                     const CFX_Matrix* matirx,
+                                     int32_t& e) {
+  ((CBC_TwoDimWriter*)m_pBCWriter)->RenderDeviceResult(device, matirx);
+  return TRUE;
+}
+
+FX_BOOL CBC_DataMatrix::RenderBitmap(CFX_DIBitmap*& pOutBitmap, int32_t& e) {
+  ((CBC_TwoDimWriter*)m_pBCWriter)->RenderBitmapResult(pOutBitmap, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
+  return TRUE;
+}
+
+CFX_WideString CBC_DataMatrix::Decode(uint8_t* buf,
+                                      int32_t width,
+                                      int32_t hight,
+                                      int32_t& e) {
+  CFX_WideString str;
+  return str;
+}
+
+CFX_WideString CBC_DataMatrix::Decode(CFX_DIBitmap* pBitmap, int32_t& e) {
+  CBC_BufferedImageLuminanceSource source(pBitmap);
+  CBC_GlobalHistogramBinarizer binarizer(&source);
+  CBC_BinaryBitmap bitmap(&binarizer);
+  CFX_ByteString retStr = m_pBCReader->Decode(&bitmap, 0, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, FX_WSTRC(L""));
+  return CFX_WideString::FromUTF8(retStr, retStr.GetLength());
+}
diff --git a/xfa/fxbarcode/cbc_datamatrix.h b/xfa/fxbarcode/cbc_datamatrix.h
new file mode 100644
index 0000000..903d0b2
--- /dev/null
+++ b/xfa/fxbarcode/cbc_datamatrix.h
@@ -0,0 +1,32 @@
+// Copyright 2016 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 XFA_FXBARCODE_CBC_DATAMATRIX_H_
+#define XFA_FXBARCODE_CBC_DATAMATRIX_H_
+
+#include "core/include/fxcrt/fx_string.h"
+#include "core/include/fxcrt/fx_system.h"
+#include "core/include/fxge/fx_dib.h"
+#include "xfa/fxbarcode/cbc_codebase.h"
+
+class CBC_DataMatrix : public CBC_CodeBase {
+ public:
+  CBC_DataMatrix();
+  virtual ~CBC_DataMatrix();
+
+  FX_BOOL Encode(const CFX_WideStringC& contents, FX_BOOL isDevice, int32_t& e);
+  CFX_WideString Decode(uint8_t* buf, int32_t width, int32_t hight, int32_t& e);
+  CFX_WideString Decode(CFX_DIBitmap* pBitmap, int32_t& e);
+
+  FX_BOOL RenderDevice(CFX_RenderDevice* device,
+                       const CFX_Matrix* matirx,
+                       int32_t& e);
+  FX_BOOL RenderBitmap(CFX_DIBitmap*& pOutBitmap, int32_t& e);
+
+  BC_TYPE GetType() { return BC_DATAMATRIX; }
+};
+
+#endif  // XFA_FXBARCODE_CBC_DATAMATRIX_H_
diff --git a/xfa/fxbarcode/cbc_ean13.cpp b/xfa/fxbarcode/cbc_ean13.cpp
new file mode 100644
index 0000000..e764122
--- /dev/null
+++ b/xfa/fxbarcode/cbc_ean13.cpp
@@ -0,0 +1,114 @@
+// Copyright 2016 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
+/*
+ * Copyright 2011 ZXing authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "xfa/fxbarcode/cbc_ean13.h"
+
+#include "xfa/fxbarcode/BC_BinaryBitmap.h"
+#include "xfa/fxbarcode/BC_BufferedImageLuminanceSource.h"
+#include "xfa/fxbarcode/common/BC_GlobalHistogramBinarizer.h"
+#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() {
+  delete (m_pBCReader);
+  delete (m_pBCWriter);
+}
+
+CFX_WideString CBC_EAN13::Preprocess(const CFX_WideStringC& contents) {
+  CFX_WideString encodeContents =
+      ((CBC_OnedEAN13Writer*)m_pBCWriter)->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);
+    byteString += checksum - 0 + '0';
+    encodeContents = byteString.UTF8Decode();
+  }
+  if (length > 13)
+    encodeContents = encodeContents.Mid(0, 13);
+
+  return encodeContents;
+}
+
+FX_BOOL CBC_EAN13::Encode(const CFX_WideStringC& contents,
+                          FX_BOOL isDevice,
+                          int32_t& e) {
+  if (contents.IsEmpty()) {
+    e = BCExceptionNoContents;
+    return FALSE;
+  }
+  BCFORMAT format = BCFORMAT_EAN_13;
+  int32_t outWidth = 0;
+  int32_t outHeight = 0;
+  CFX_WideString encodeContents = Preprocess(contents);
+  CFX_ByteString byteString = encodeContents.UTF8Encode();
+  m_renderContents = encodeContents;
+  uint8_t* data = static_cast<CBC_OnedEAN13Writer*>(m_pBCWriter)
+                      ->Encode(byteString, format, outWidth, outHeight, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
+  ((CBC_OneDimWriter*)m_pBCWriter)
+      ->RenderResult(encodeContents, data, outWidth, isDevice, e);
+  FX_Free(data);
+  BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
+  return TRUE;
+}
+
+FX_BOOL CBC_EAN13::RenderDevice(CFX_RenderDevice* device,
+                                const CFX_Matrix* matirx,
+                                int32_t& e) {
+  ((CBC_OneDimWriter*)m_pBCWriter)
+      ->RenderDeviceResult(device, matirx, m_renderContents, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
+  return TRUE;
+}
+
+FX_BOOL CBC_EAN13::RenderBitmap(CFX_DIBitmap*& pOutBitmap, int32_t& e) {
+  ((CBC_OneDimWriter*)m_pBCWriter)
+      ->RenderBitmapResult(pOutBitmap, m_renderContents, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
+  return TRUE;
+}
+
+CFX_WideString CBC_EAN13::Decode(uint8_t* buf,
+                                 int32_t width,
+                                 int32_t hight,
+                                 int32_t& e) {
+  CFX_WideString str;
+  return str;
+}
+
+CFX_WideString CBC_EAN13::Decode(CFX_DIBitmap* pBitmap, int32_t& e) {
+  CBC_BufferedImageLuminanceSource source(pBitmap);
+  CBC_GlobalHistogramBinarizer binarizer(&source);
+  CBC_BinaryBitmap bitmap(&binarizer);
+  CFX_ByteString str = m_pBCReader->Decode(&bitmap, 0, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, FX_WSTRC(L""));
+  return CFX_WideString::FromUTF8(str, str.GetLength());
+}
diff --git a/xfa/fxbarcode/cbc_ean13.h b/xfa/fxbarcode/cbc_ean13.h
new file mode 100644
index 0000000..c9ecc90
--- /dev/null
+++ b/xfa/fxbarcode/cbc_ean13.h
@@ -0,0 +1,36 @@
+// Copyright 2016 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 XFA_FXBARCODE_CBC_EAN13_H_
+#define XFA_FXBARCODE_CBC_EAN13_H_
+
+#include "core/include/fxcrt/fx_string.h"
+#include "core/include/fxcrt/fx_system.h"
+#include "core/include/fxge/fx_dib.h"
+#include "xfa/fxbarcode/cbc_onecode.h"
+
+class CBC_EAN13 : public CBC_OneCode {
+ public:
+  CBC_EAN13();
+  virtual ~CBC_EAN13();
+
+  FX_BOOL Encode(const CFX_WideStringC& contents, FX_BOOL isDevice, int32_t& e);
+  CFX_WideString Decode(uint8_t* buf, int32_t width, int32_t hight, int32_t& e);
+  CFX_WideString Decode(CFX_DIBitmap* pBitmap, int32_t& e);
+
+  FX_BOOL RenderDevice(CFX_RenderDevice* device,
+                       const CFX_Matrix* matirx,
+                       int32_t& e);
+  FX_BOOL RenderBitmap(CFX_DIBitmap*& pOutBitmap, int32_t& e);
+
+  BC_TYPE GetType() { return BC_EAN13; }
+
+ private:
+  CFX_WideString Preprocess(const CFX_WideStringC& contents);
+  CFX_WideString m_renderContents;
+};
+
+#endif  // XFA_FXBARCODE_CBC_EAN13_H_
diff --git a/xfa/fxbarcode/cbc_ean8.cpp b/xfa/fxbarcode/cbc_ean8.cpp
new file mode 100644
index 0000000..bc983b8
--- /dev/null
+++ b/xfa/fxbarcode/cbc_ean8.cpp
@@ -0,0 +1,113 @@
+// Copyright 2016 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
+/*
+ * Copyright 2011 ZXing authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "xfa/fxbarcode/cbc_ean8.h"
+
+#include "xfa/fxbarcode/BC_BinaryBitmap.h"
+#include "xfa/fxbarcode/BC_BufferedImageLuminanceSource.h"
+#include "xfa/fxbarcode/common/BC_GlobalHistogramBinarizer.h"
+#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() {
+  delete (m_pBCReader);
+  delete (m_pBCWriter);
+}
+
+CFX_WideString CBC_EAN8::Preprocess(const CFX_WideStringC& contents) {
+  CFX_WideString encodeContents =
+      ((CBC_OnedEAN8Writer*)m_pBCWriter)->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);
+    encodeContents += FX_WCHAR(checksum - 0 + '0');
+  }
+  if (length > 8)
+    encodeContents = encodeContents.Mid(0, 8);
+
+  return encodeContents;
+}
+
+FX_BOOL CBC_EAN8::Encode(const CFX_WideStringC& contents,
+                         FX_BOOL isDevice,
+                         int32_t& e) {
+  if (contents.IsEmpty()) {
+    e = BCExceptionNoContents;
+    return FALSE;
+  }
+  BCFORMAT format = BCFORMAT_EAN_8;
+  int32_t outWidth = 0;
+  int32_t outHeight = 0;
+  CFX_WideString encodeContents = Preprocess(contents);
+  CFX_ByteString byteString = encodeContents.UTF8Encode();
+  m_renderContents = encodeContents;
+  uint8_t* data = static_cast<CBC_OnedEAN8Writer*>(m_pBCWriter)
+                      ->Encode(byteString, format, outWidth, outHeight, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
+  ((CBC_OneDimWriter*)m_pBCWriter)
+      ->RenderResult(encodeContents, data, outWidth, isDevice, e);
+  FX_Free(data);
+  BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
+  return TRUE;
+}
+
+FX_BOOL CBC_EAN8::RenderDevice(CFX_RenderDevice* device,
+                               const CFX_Matrix* matirx,
+                               int32_t& e) {
+  ((CBC_OneDimWriter*)m_pBCWriter)
+      ->RenderDeviceResult(device, matirx, m_renderContents, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
+  return TRUE;
+}
+
+FX_BOOL CBC_EAN8::RenderBitmap(CFX_DIBitmap*& pOutBitmap, int32_t& e) {
+  ((CBC_OneDimWriter*)m_pBCWriter)
+      ->RenderBitmapResult(pOutBitmap, m_renderContents, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
+  return TRUE;
+}
+
+CFX_WideString CBC_EAN8::Decode(uint8_t* buf,
+                                int32_t width,
+                                int32_t hight,
+                                int32_t& e) {
+  CFX_WideString str;
+  return str;
+}
+
+CFX_WideString CBC_EAN8::Decode(CFX_DIBitmap* pBitmap, int32_t& e) {
+  CBC_BufferedImageLuminanceSource source(pBitmap);
+  CBC_GlobalHistogramBinarizer binarizer(&source);
+  CBC_BinaryBitmap bitmap(&binarizer);
+  CFX_ByteString str = m_pBCReader->Decode(&bitmap, 0, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, FX_WSTRC(L""));
+  return CFX_WideString::FromUTF8(str, str.GetLength());
+}
diff --git a/xfa/fxbarcode/cbc_ean8.h b/xfa/fxbarcode/cbc_ean8.h
new file mode 100644
index 0000000..95a61d2
--- /dev/null
+++ b/xfa/fxbarcode/cbc_ean8.h
@@ -0,0 +1,36 @@
+// Copyright 2016 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 XFA_FXBARCODE_CBC_EAN8_H_
+#define XFA_FXBARCODE_CBC_EAN8_H_
+
+#include "core/include/fxcrt/fx_string.h"
+#include "core/include/fxcrt/fx_system.h"
+#include "core/include/fxge/fx_dib.h"
+#include "xfa/fxbarcode/cbc_onecode.h"
+
+class CBC_EAN8 : public CBC_OneCode {
+ public:
+  CBC_EAN8();
+  virtual ~CBC_EAN8();
+
+  FX_BOOL Encode(const CFX_WideStringC& contents, FX_BOOL isDevice, int32_t& e);
+  CFX_WideString Decode(uint8_t* buf, int32_t width, int32_t hight, int32_t& e);
+  CFX_WideString Decode(CFX_DIBitmap* pBitmap, int32_t& e);
+
+  FX_BOOL RenderDevice(CFX_RenderDevice* device,
+                       const CFX_Matrix* matirx,
+                       int32_t& e);
+  FX_BOOL RenderBitmap(CFX_DIBitmap*& pOutBitmap, int32_t& e);
+
+  BC_TYPE GetType() { return BC_EAN8; }
+
+ private:
+  CFX_WideString Preprocess(const CFX_WideStringC& contents);
+  CFX_WideString m_renderContents;
+};
+
+#endif  // XFA_FXBARCODE_CBC_EAN8_H_
diff --git a/xfa/fxbarcode/cbc_onecode.cpp b/xfa/fxbarcode/cbc_onecode.cpp
new file mode 100644
index 0000000..f5e1a39
--- /dev/null
+++ b/xfa/fxbarcode/cbc_onecode.cpp
@@ -0,0 +1,77 @@
+// Copyright 2016 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
+/*
+ * Copyright 2011 ZXing authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "xfa/fxbarcode/cbc_onecode.h"
+
+#include "xfa/fxbarcode/oned/BC_OneDimWriter.h"
+
+CBC_OneCode::CBC_OneCode() {}
+
+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;
+}
+
+CFX_WideString CBC_OneCode::FilterContents(const CFX_WideStringC& contents) {
+  CFX_WideString tmp;
+  if (!m_pBCWriter)
+    return tmp;
+  return ((CBC_OneDimWriter*)m_pBCWriter)->FilterContents(contents);
+}
+
+void CBC_OneCode::SetPrintChecksum(FX_BOOL checksum) {
+  if (m_pBCWriter)
+    ((CBC_OneDimWriter*)m_pBCWriter)->SetPrintChecksum(checksum);
+}
+
+void CBC_OneCode::SetDataLength(int32_t length) {
+  if (m_pBCWriter)
+    ((CBC_OneDimWriter*)m_pBCWriter)->SetDataLength(length);
+}
+
+void CBC_OneCode::SetCalChecksum(FX_BOOL calc) {
+  if (m_pBCWriter)
+    ((CBC_OneDimWriter*)m_pBCWriter)->SetCalcChecksum(calc);
+}
+
+FX_BOOL CBC_OneCode::SetFont(CFX_Font* cFont) {
+  if (m_pBCWriter)
+    return ((CBC_OneDimWriter*)m_pBCWriter)->SetFont(cFont);
+  return FALSE;
+}
+
+void CBC_OneCode::SetFontSize(FX_FLOAT size) {
+  if (m_pBCWriter)
+    ((CBC_OneDimWriter*)m_pBCWriter)->SetFontSize(size);
+}
+
+void CBC_OneCode::SetFontStyle(int32_t style) {
+  if (m_pBCWriter)
+    ((CBC_OneDimWriter*)m_pBCWriter)->SetFontStyle(style);
+}
+
+void CBC_OneCode::SetFontColor(FX_ARGB color) {
+  if (m_pBCWriter)
+    ((CBC_OneDimWriter*)m_pBCWriter)->SetFontColor(color);
+}
diff --git a/xfa/fxbarcode/cbc_onecode.h b/xfa/fxbarcode/cbc_onecode.h
new file mode 100644
index 0000000..ac070a4
--- /dev/null
+++ b/xfa/fxbarcode/cbc_onecode.h
@@ -0,0 +1,52 @@
+// Copyright 2016 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 XFA_FXBARCODE_CBC_ONECODE_H_
+#define XFA_FXBARCODE_CBC_ONECODE_H_
+
+#include "core/include/fxcrt/fx_string.h"
+#include "core/include/fxcrt/fx_system.h"
+#include "xfa/fxbarcode/cbc_codebase.h"
+
+class CFX_DIBitmap;
+class CFX_Font;
+class CFX_RenderDevice;
+
+class CBC_OneCode : public CBC_CodeBase {
+ public:
+  CBC_OneCode();
+  virtual ~CBC_OneCode();
+
+  virtual BC_TYPE GetType() = 0;
+
+  virtual FX_BOOL Encode(const CFX_WideStringC& contents,
+                         FX_BOOL isDevice,
+                         int32_t& e) = 0;
+  virtual CFX_WideString Decode(uint8_t* buf,
+                                int32_t width,
+                                int32_t hight,
+                                int32_t& e) = 0;
+  virtual CFX_WideString Decode(CFX_DIBitmap* pBitmap, int32_t& e) = 0;
+
+  virtual FX_BOOL RenderDevice(CFX_RenderDevice* device,
+                               const CFX_Matrix* matirx,
+                               int32_t& e) = 0;
+  virtual FX_BOOL RenderBitmap(CFX_DIBitmap*& pOutBitmap, int32_t& e) = 0;
+
+
+  virtual FX_BOOL CheckContentValidity(const CFX_WideStringC& contents);
+  virtual CFX_WideString FilterContents(const CFX_WideStringC& contents);
+
+  virtual void SetPrintChecksum(FX_BOOL checksum);
+  virtual void SetDataLength(int32_t length);
+  virtual void SetCalChecksum(FX_BOOL calc);
+  virtual FX_BOOL SetFont(CFX_Font* cFont);
+  virtual void SetFontSize(FX_FLOAT size);
+  virtual void SetFontStyle(int32_t style);
+  virtual void SetFontColor(FX_ARGB color);
+};
+
+#endif  // XFA_FXBARCODE_CBC_ONECODE_H_
diff --git a/xfa/fxbarcode/cbc_pdf417i.cpp b/xfa/fxbarcode/cbc_pdf417i.cpp
new file mode 100644
index 0000000..b27af1c
--- /dev/null
+++ b/xfa/fxbarcode/cbc_pdf417i.cpp
@@ -0,0 +1,91 @@
+// Copyright 2016 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
+/*
+ * Copyright 2011 ZXing authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "xfa/fxbarcode/cbc_pdf417i.h"
+
+#include "xfa/fxbarcode/BC_BinaryBitmap.h"
+#include "xfa/fxbarcode/BC_BufferedImageLuminanceSource.h"
+#include "xfa/fxbarcode/common/BC_GlobalHistogramBinarizer.h"
+#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() {
+  delete (m_pBCReader);
+  delete (m_pBCWriter);
+}
+
+FX_BOOL CBC_PDF417I::SetErrorCorrectionLevel(int32_t level) {
+  ((CBC_PDF417Writer*)m_pBCWriter)->SetErrorCorrectionLevel(level);
+  return TRUE;
+}
+
+void CBC_PDF417I::SetTruncated(FX_BOOL truncated) {
+  ((CBC_PDF417Writer*)m_pBCWriter)->SetTruncated(truncated);
+}
+
+FX_BOOL CBC_PDF417I::Encode(const CFX_WideStringC& contents,
+                            FX_BOOL isDevice,
+                            int32_t& e) {
+  int32_t outWidth = 0;
+  int32_t outHeight = 0;
+  uint8_t* data = ((CBC_PDF417Writer*)m_pBCWriter)
+                      ->Encode(contents, outWidth, outHeight, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
+  ((CBC_TwoDimWriter*)m_pBCWriter)->RenderResult(data, outWidth, outHeight, e);
+  FX_Free(data);
+  BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
+  return TRUE;
+}
+
+FX_BOOL CBC_PDF417I::RenderDevice(CFX_RenderDevice* device,
+                                  const CFX_Matrix* matirx,
+                                  int32_t& e) {
+  ((CBC_TwoDimWriter*)m_pBCWriter)->RenderDeviceResult(device, matirx);
+  return TRUE;
+}
+
+FX_BOOL CBC_PDF417I::RenderBitmap(CFX_DIBitmap*& pOutBitmap, int32_t& e) {
+  ((CBC_TwoDimWriter*)m_pBCWriter)->RenderBitmapResult(pOutBitmap, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
+  return TRUE;
+}
+
+CFX_WideString CBC_PDF417I::Decode(uint8_t* buf,
+                                   int32_t width,
+                                   int32_t hight,
+                                   int32_t& e) {
+  CFX_WideString str;
+  return str;
+}
+
+CFX_WideString CBC_PDF417I::Decode(CFX_DIBitmap* pBitmap, int32_t& e) {
+  CBC_BufferedImageLuminanceSource source(pBitmap);
+  CBC_GlobalHistogramBinarizer binarizer(&source);
+  CBC_BinaryBitmap bitmap(&binarizer);
+  CFX_ByteString bytestring = m_pBCReader->Decode(&bitmap, 0, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, FX_WSTRC(L""));
+  return CFX_WideString::FromUTF8(bytestring, bytestring.GetLength());
+}
diff --git a/xfa/fxbarcode/cbc_pdf417i.h b/xfa/fxbarcode/cbc_pdf417i.h
new file mode 100644
index 0000000..b8f45fa
--- /dev/null
+++ b/xfa/fxbarcode/cbc_pdf417i.h
@@ -0,0 +1,35 @@
+// Copyright 2016 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 XFA_FXBARCODE_CBC_PDF417I_H_
+#define XFA_FXBARCODE_CBC_PDF417I_H_
+
+#include "core/include/fxcrt/fx_string.h"
+#include "core/include/fxcrt/fx_system.h"
+#include "core/include/fxge/fx_dib.h"
+#include "xfa/fxbarcode/cbc_codebase.h"
+
+class CBC_PDF417I : public CBC_CodeBase {
+ public:
+  CBC_PDF417I();
+  virtual ~CBC_PDF417I();
+
+  FX_BOOL Encode(const CFX_WideStringC& contents, FX_BOOL isDevice, int32_t& e);
+  CFX_WideString Decode(uint8_t* buf, int32_t width, int32_t hight, int32_t& e);
+  CFX_WideString Decode(CFX_DIBitmap* pBitmap, int32_t& e);
+
+  FX_BOOL RenderDevice(CFX_RenderDevice* device,
+                       const CFX_Matrix* matirx,
+                       int32_t& e);
+  FX_BOOL RenderBitmap(CFX_DIBitmap*& pOutBitmap, int32_t& e);
+
+  BC_TYPE GetType() { return BC_PDF417; }
+
+  FX_BOOL SetErrorCorrectionLevel(int32_t level);
+  void SetTruncated(FX_BOOL truncated);
+};
+
+#endif  // XFA_FXBARCODE_CBC_PDF417I_H_
diff --git a/xfa/fxbarcode/cbc_qrcode.cpp b/xfa/fxbarcode/cbc_qrcode.cpp
new file mode 100644
index 0000000..4518594
--- /dev/null
+++ b/xfa/fxbarcode/cbc_qrcode.cpp
@@ -0,0 +1,101 @@
+// Copyright 2016 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
+/*
+ * Copyright 2011 ZXing authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "xfa/fxbarcode/cbc_qrcode.h"
+
+#include "xfa/fxbarcode/BC_BinaryBitmap.h"
+#include "xfa/fxbarcode/BC_BufferedImageLuminanceSource.h"
+#include "xfa/fxbarcode/common/BC_GlobalHistogramBinarizer.h"
+#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() {
+  delete (m_pBCReader);
+  delete (m_pBCWriter);
+}
+
+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);
+}
+
+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);
+}
+
+FX_BOOL CBC_QRCode::Encode(const CFX_WideStringC& contents,
+                           FX_BOOL isDevice,
+                           int32_t& e) {
+  int32_t outWidth = 0;
+  int32_t outHeight = 0;
+  uint8_t* data = ((CBC_QRCodeWriter*)m_pBCWriter)
+                      ->Encode(contents, ((CBC_QRCodeWriter*)m_pBCWriter)
+                                             ->GetErrorCorrectionLevel(),
+                               outWidth, outHeight, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
+  ((CBC_TwoDimWriter*)m_pBCWriter)->RenderResult(data, outWidth, outHeight, e);
+  FX_Free(data);
+  BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
+  return TRUE;
+}
+
+FX_BOOL CBC_QRCode::RenderDevice(CFX_RenderDevice* device,
+                                 const CFX_Matrix* matirx,
+                                 int32_t& e) {
+  ((CBC_TwoDimWriter*)m_pBCWriter)->RenderDeviceResult(device, matirx);
+  return TRUE;
+}
+
+FX_BOOL CBC_QRCode::RenderBitmap(CFX_DIBitmap*& pOutBitmap, int32_t& e) {
+  ((CBC_TwoDimWriter*)m_pBCWriter)->RenderBitmapResult(pOutBitmap, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
+  return TRUE;
+}
+
+CFX_WideString CBC_QRCode::Decode(uint8_t* buf,
+                                  int32_t width,
+                                  int32_t hight,
+                                  int32_t& e) {
+  CFX_WideString str;
+  return str;
+}
+
+CFX_WideString CBC_QRCode::Decode(CFX_DIBitmap* pBitmap, int32_t& e) {
+  CBC_BufferedImageLuminanceSource source(pBitmap);
+  CBC_GlobalHistogramBinarizer binarizer(&source);
+  CBC_BinaryBitmap bitmap(&binarizer);
+  CFX_ByteString retStr = m_pBCReader->Decode(&bitmap, 0, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, FX_WSTRC(L""));
+  return CFX_WideString::FromUTF8(retStr, retStr.GetLength());
+}
diff --git a/xfa/fxbarcode/cbc_qrcode.h b/xfa/fxbarcode/cbc_qrcode.h
new file mode 100644
index 0000000..1198194
--- /dev/null
+++ b/xfa/fxbarcode/cbc_qrcode.h
@@ -0,0 +1,35 @@
+// Copyright 2016 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 XFA_FXBARCODE_CBC_QRCODE_H_
+#define XFA_FXBARCODE_CBC_QRCODE_H_
+
+#include "core/include/fxcrt/fx_string.h"
+#include "core/include/fxcrt/fx_system.h"
+#include "core/include/fxge/fx_dib.h"
+#include "xfa/fxbarcode/cbc_codebase.h"
+
+class CBC_QRCode : public CBC_CodeBase {
+ public:
+  CBC_QRCode();
+  virtual ~CBC_QRCode();
+
+  FX_BOOL Encode(const CFX_WideStringC& contents, FX_BOOL isDevice, int32_t& e);
+  CFX_WideString Decode(uint8_t* buf, int32_t width, int32_t hight, int32_t& e);
+  CFX_WideString Decode(CFX_DIBitmap* pBitmap, int32_t& e);
+
+  FX_BOOL RenderDevice(CFX_RenderDevice* device,
+                       const CFX_Matrix* matirx,
+                       int32_t& e);
+  FX_BOOL RenderBitmap(CFX_DIBitmap*& pOutBitmap, int32_t& e);
+
+  BC_TYPE GetType() { return BC_QR_CODE; }
+
+  FX_BOOL SetVersion(int32_t version);
+  FX_BOOL SetErrorCorrectionLevel(int32_t level);
+};
+
+#endif  // XFA_FXBARCODE_CBC_QRCODE_H_
diff --git a/xfa/fxbarcode/cbc_upca.cpp b/xfa/fxbarcode/cbc_upca.cpp
new file mode 100644
index 0000000..220b8fa
--- /dev/null
+++ b/xfa/fxbarcode/cbc_upca.cpp
@@ -0,0 +1,116 @@
+// Copyright 2016 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
+/*
+ * Copyright 2011 ZXing authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "xfa/fxbarcode/cbc_upca.h"
+
+#include "xfa/fxbarcode/BC_BinaryBitmap.h"
+#include "xfa/fxbarcode/BC_BufferedImageLuminanceSource.h"
+#include "xfa/fxbarcode/common/BC_GlobalHistogramBinarizer.h"
+#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() {
+  delete (m_pBCReader);
+  delete (m_pBCWriter);
+}
+
+CFX_WideString CBC_UPCA::Preprocess(const CFX_WideStringC& contents) {
+  CFX_WideString encodeContents =
+      ((CBC_OnedUPCAWriter*)m_pBCWriter)->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);
+    byteString += checksum - 0 + '0';
+    encodeContents = byteString.UTF8Decode();
+  }
+  if (length > 12)
+    encodeContents = encodeContents.Mid(0, 12);
+
+  return encodeContents;
+}
+
+FX_BOOL CBC_UPCA::Encode(const CFX_WideStringC& contents,
+                         FX_BOOL isDevice,
+                         int32_t& e) {
+  if (contents.IsEmpty()) {
+    e = BCExceptionNoContents;
+    return FALSE;
+  }
+  BCFORMAT format = BCFORMAT_UPC_A;
+  int32_t outWidth = 0;
+  int32_t outHeight = 0;
+  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);
+  BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
+  ((CBC_OneDimWriter*)m_pBCWriter)
+      ->RenderResult(encodeContents, data, outWidth, isDevice, e);
+  FX_Free(data);
+  BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
+  return TRUE;
+}
+
+FX_BOOL CBC_UPCA::RenderDevice(CFX_RenderDevice* device,
+                               const CFX_Matrix* matirx,
+                               int32_t& e) {
+  ((CBC_OneDimWriter*)m_pBCWriter)
+      ->RenderDeviceResult(device, matirx, m_renderContents, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
+  return TRUE;
+}
+
+FX_BOOL CBC_UPCA::RenderBitmap(CFX_DIBitmap*& pOutBitmap, int32_t& e) {
+  ((CBC_OneDimWriter*)m_pBCWriter)
+      ->RenderBitmapResult(pOutBitmap, m_renderContents, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, FALSE);
+  return TRUE;
+}
+
+CFX_WideString CBC_UPCA::Decode(uint8_t* buf,
+                                int32_t width,
+                                int32_t hight,
+                                int32_t& e) {
+  CFX_WideString str;
+  return str;
+}
+
+CFX_WideString CBC_UPCA::Decode(CFX_DIBitmap* pBitmap, int32_t& e) {
+  CBC_BufferedImageLuminanceSource source(pBitmap);
+  CBC_GlobalHistogramBinarizer binarizer(&source);
+  CBC_BinaryBitmap bitmap(&binarizer);
+  CFX_ByteString str = m_pBCReader->Decode(&bitmap, 0, e);
+  BC_EXCEPTION_CHECK_ReturnValue(e, FX_WSTRC(L""));
+  return CFX_WideString::FromUTF8(str, str.GetLength());
+}
diff --git a/xfa/fxbarcode/cbc_upca.h b/xfa/fxbarcode/cbc_upca.h
new file mode 100644
index 0000000..ee4c31b
--- /dev/null
+++ b/xfa/fxbarcode/cbc_upca.h
@@ -0,0 +1,33 @@
+// Copyright 2016 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 XFA_FXBARCODE_CBC_UPCA_H_
+#define XFA_FXBARCODE_CBC_UPCA_H_
+
+#include "core/include/fxcrt/fx_string.h"
+#include "core/include/fxcrt/fx_system.h"
+#include "core/include/fxge/fx_dib.h"
+#include "xfa/fxbarcode/cbc_onecode.h"
+
+class CBC_UPCA : public CBC_OneCode {
+ public:
+  CBC_UPCA();
+  virtual ~CBC_UPCA();
+  FX_BOOL Encode(const CFX_WideStringC& contents, FX_BOOL isDevice, int32_t& e);
+  FX_BOOL RenderDevice(CFX_RenderDevice* device,
+                       const CFX_Matrix* matirx,
+                       int32_t& e);
+  FX_BOOL RenderBitmap(CFX_DIBitmap*& pOutBitmap, int32_t& e);
+  CFX_WideString Decode(uint8_t* buf, int32_t width, int32_t hight, int32_t& e);
+  CFX_WideString Decode(CFX_DIBitmap* pBitmap, int32_t& e);
+  BC_TYPE GetType() { return BC_UPCA; }
+
+ private:
+  CFX_WideString Preprocess(const CFX_WideStringC& contents);
+  CFX_WideString m_renderContents;
+};
+
+#endif  // XFA_FXBARCODE_CBC_UPCA_H_
diff --git a/xfa/fxbarcode/include/BC_Library.h b/xfa/fxbarcode/include/BC_Library.h
new file mode 100644
index 0000000..d0bd85b
--- /dev/null
+++ b/xfa/fxbarcode/include/BC_Library.h
@@ -0,0 +1,38 @@
+// Copyright 2016 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 XFA_FXBARCODE_INCLUDE_BC_LIBRARY_H_
+#define XFA_FXBARCODE_INCLUDE_BC_LIBRARY_H_
+
+enum BC_TEXT_LOC {
+  BC_TEXT_LOC_NONE = 0,
+  BC_TEXT_LOC_ABOVE,
+  BC_TEXT_LOC_BELOW,
+  BC_TEXT_LOC_ABOVEEMBED,
+  BC_TEXT_LOC_BELOWEMBED
+};
+
+enum BC_CHAR_ENCODING { CHAR_ENCODING_UTF8 = 0, CHAR_ENCODING_UNICODE };
+
+enum BC_TYPE {
+  BC_UNKNOWN = -1,
+  BC_CODE39 = 0,
+  BC_CODABAR,
+  BC_CODE128,
+  BC_CODE128_B,
+  BC_CODE128_C,
+  BC_EAN8,
+  BC_UPCA,
+  BC_EAN13,
+  BC_QR_CODE,
+  BC_PDF417,
+  BC_DATAMATRIX
+};
+
+void BC_Library_Init();
+void BC_Library_Destory();
+
+#endif  // XFA_FXBARCODE_INCLUDE_BC_LIBRARY_H_
diff --git a/xfa/fxbarcode/oned/BC_OneDimWriter.h b/xfa/fxbarcode/oned/BC_OneDimWriter.h
index e91a929..b015070 100644
--- a/xfa/fxbarcode/oned/BC_OneDimWriter.h
+++ b/xfa/fxbarcode/oned/BC_OneDimWriter.h
@@ -9,7 +9,7 @@
 
 #include "core/include/fxge/fx_ge.h"
 #include "xfa/fxbarcode/BC_Writer.h"
-#include "xfa/include/fxbarcode/BC_BarCode.h"
+#include "xfa/fxbarcode/include/BC_Library.h"
 
 class CBC_CommonBitMatrix;
 class CFX_Font;
@@ -19,6 +19,7 @@
  public:
   CBC_OneDimWriter();
   virtual ~CBC_OneDimWriter();
+
   uint8_t* Encode(const CFX_ByteString& contents,
                   BCFORMAT format,
                   int32_t& outWidth,
@@ -35,6 +36,7 @@
                           int32_t& e) {
     return NULL;
   }
+
   virtual void RenderResult(const CFX_WideStringC& contents,
                             uint8_t* code,
                             int32_t codeLength,
@@ -65,21 +67,6 @@
   virtual FX_BOOL SetFont(CFX_Font* cFont);
 
  protected:
-  FX_BOOL m_bPrintChecksum;
-  int32_t m_iDataLenth;
-  FX_BOOL m_bCalcChecksum;
-  CFX_Font* m_pFont;
-  FX_FLOAT m_fFontSize;
-  int32_t m_iFontStyle;
-  FX_DWORD m_fontColor;
-  BC_TEXT_LOC m_locTextLoc;
-  int32_t m_iContentLen;
-  FX_BOOL m_bLeftPadding;
-  FX_BOOL m_bRightPadding;
-  CBC_CommonBitMatrix* m_output;
-  int32_t m_barWidth;
-  int32_t m_multiple;
-  FX_FLOAT m_outputHScale;
   void CalcTextInfo(const CFX_ByteString& text,
                     FXTEXT_CHARPOS* charPos,
                     CFX_Font* cFont,
@@ -115,6 +102,22 @@
                         int32_t startColor,
                         int32_t& e);
   FX_WCHAR Upper(FX_WCHAR ch);
+
+  FX_BOOL m_bPrintChecksum;
+  int32_t m_iDataLenth;
+  FX_BOOL m_bCalcChecksum;
+  CFX_Font* m_pFont;
+  FX_FLOAT m_fFontSize;
+  int32_t m_iFontStyle;
+  FX_DWORD m_fontColor;
+  BC_TEXT_LOC m_locTextLoc;
+  int32_t m_iContentLen;
+  FX_BOOL m_bLeftPadding;
+  FX_BOOL m_bRightPadding;
+  CBC_CommonBitMatrix* m_output;
+  int32_t m_barWidth;
+  int32_t m_multiple;
+  FX_FLOAT m_outputHScale;
 };
 
 #endif  // XFA_FXBARCODE_ONED_BC_ONEDIMWRITER_H_
diff --git a/xfa/fxbarcode/oned/BC_OnedCodaBarWriter.h b/xfa/fxbarcode/oned/BC_OnedCodaBarWriter.h
index 92a31bd..53af246 100644
--- a/xfa/fxbarcode/oned/BC_OnedCodaBarWriter.h
+++ b/xfa/fxbarcode/oned/BC_OnedCodaBarWriter.h
@@ -7,13 +7,16 @@
 #ifndef XFA_FXBARCODE_ONED_BC_ONEDCODABARWRITER_H_
 #define XFA_FXBARCODE_ONED_BC_ONEDCODABARWRITER_H_
 
-enum BC_TEXT_LOC;
-class CBC_OneDimWriter;
-class CBC_OnedCodaBarWriter;
+#include "core/include/fxcrt/fx_string.h"
+#include "core/include/fxcrt/fx_system.h"
+#include "xfa/fxbarcode/include/BC_Library.h"
+#include "xfa/fxbarcode/oned/BC_OneDimWriter.h"
+
 class CBC_OnedCodaBarWriter : public CBC_OneDimWriter {
  public:
   CBC_OnedCodaBarWriter();
   virtual ~CBC_OnedCodaBarWriter();
+
   uint8_t* Encode(const CFX_ByteString& contents,
                   int32_t& outLength,
                   int32_t& e);
@@ -28,6 +31,7 @@
                   int32_t& outHeight,
                   int32_t hints,
                   int32_t& e);
+
   CFX_WideString encodedContents(const CFX_WideStringC& contents);
   FX_BOOL CheckContentValidity(const CFX_WideStringC& contents);
   CFX_WideString FilterContents(const CFX_WideStringC& contents);
@@ -39,13 +43,15 @@
   FX_BOOL FindChar(FX_WCHAR ch, FX_BOOL isContent);
 
  private:
+  static const FX_CHAR START_END_CHARS[];
+  static const FX_CHAR CONTENT_CHARS[];
+
   void RenderResult(const CFX_WideStringC& contents,
                     uint8_t* code,
                     int32_t codeLength,
                     FX_BOOL isDevice,
                     int32_t& e);
-  static const FX_CHAR START_END_CHARS[];
-  static const FX_CHAR CONTENT_CHARS[];
+
   FX_CHAR m_chStart;
   FX_CHAR m_chEnd;
   int32_t m_iWideNarrRatio;
diff --git a/xfa/fxbarcode/oned/BC_OnedCode128Reader.h b/xfa/fxbarcode/oned/BC_OnedCode128Reader.h
index d9ac485..df21d7a 100644
--- a/xfa/fxbarcode/oned/BC_OnedCode128Reader.h
+++ b/xfa/fxbarcode/oned/BC_OnedCode128Reader.h
@@ -7,8 +7,10 @@
 #ifndef XFA_FXBARCODE_ONED_BC_ONEDCODE128READER_H_
 #define XFA_FXBARCODE_ONED_BC_ONEDCODE128READER_H_
 
-class CBC_OneDReader;
+#include "xfa/fxbarcode/oned/BC_OneDReader.h"
+
 class CBC_CommonBitArray;
+
 class CBC_OnedCode128Reader : public CBC_OneDReader {
  public:
   CBC_OnedCode128Reader();
diff --git a/xfa/fxbarcode/oned/BC_OnedCode128Writer.cpp b/xfa/fxbarcode/oned/BC_OnedCode128Writer.cpp
index 4d759b4..ac05e78 100644
--- a/xfa/fxbarcode/oned/BC_OnedCode128Writer.cpp
+++ b/xfa/fxbarcode/oned/BC_OnedCode128Writer.cpp
@@ -27,12 +27,6 @@
 #include "xfa/fxbarcode/oned/BC_OnedCode128Reader.h"
 #include "xfa/fxbarcode/oned/BC_OnedCode128Writer.h"
 
-const int32_t CBC_OnedCode128Writer::CODE_CODE_B = 100;
-const int32_t CBC_OnedCode128Writer::CODE_CODE_C = 99;
-const int32_t CBC_OnedCode128Writer::CODE_START_B = 104;
-const int32_t CBC_OnedCode128Writer::CODE_START_C = 105;
-const int32_t CBC_OnedCode128Writer::CODE_STOP = 106;
-
 CBC_OnedCode128Writer::CBC_OnedCode128Writer() {
   m_codeFormat = BC_CODE128_B;
 }
diff --git a/xfa/fxbarcode/oned/BC_OnedCode128Writer.h b/xfa/fxbarcode/oned/BC_OnedCode128Writer.h
index 9be05a1..5b68d5c 100644
--- a/xfa/fxbarcode/oned/BC_OnedCode128Writer.h
+++ b/xfa/fxbarcode/oned/BC_OnedCode128Writer.h
@@ -7,12 +7,16 @@
 #ifndef XFA_FXBARCODE_ONED_BC_ONEDCODE128WRITER_H_
 #define XFA_FXBARCODE_ONED_BC_ONEDCODE128WRITER_H_
 
-class CBC_OneDimWriter;
+#include "core/include/fxcrt/fx_string.h"
+#include "core/include/fxcrt/fx_system.h"
+#include "xfa/fxbarcode/oned/BC_OneDimWriter.h"
+
 class CBC_OnedCode128Writer : public CBC_OneDimWriter {
  public:
   CBC_OnedCode128Writer();
-  CBC_OnedCode128Writer(BC_TYPE type);
+  explicit CBC_OnedCode128Writer(BC_TYPE type);
   virtual ~CBC_OnedCode128Writer();
+
   uint8_t* Encode(const CFX_ByteString& contents,
                   BCFORMAT format,
                   int32_t& outWidth,
@@ -27,23 +31,26 @@
   uint8_t* Encode(const CFX_ByteString& contents,
                   int32_t& outLength,
                   int32_t& e);
+
   FX_BOOL CheckContentValidity(const CFX_WideStringC& contents);
   CFX_WideString FilterContents(const CFX_WideStringC& contents);
   FX_BOOL SetTextLocation(BC_TEXT_LOC location);
   BC_TYPE GetType();
 
  private:
+  static const int32_t CODE_CODE_B = 100;
+  static const int32_t CODE_CODE_C = 99;
+  static const int32_t CODE_START_B = 104;
+  static const int32_t CODE_START_C = 105;
+  static const int32_t CODE_STOP = 106;
+
   FX_BOOL IsDigits(const CFX_ByteString& contents,
                    int32_t start,
                    int32_t length);
   int32_t Encode128B(const CFX_ByteString& contents, CFX_PtrArray& patterns);
   int32_t Encode128C(const CFX_ByteString& contents, CFX_PtrArray& patterns);
+
   BC_TYPE m_codeFormat;
-  static const int32_t CODE_START_B;
-  static const int32_t CODE_START_C;
-  static const int32_t CODE_CODE_B;
-  static const int32_t CODE_CODE_C;
-  static const int32_t CODE_STOP;
 };
 
 #endif  // XFA_FXBARCODE_ONED_BC_ONEDCODE128WRITER_H_
diff --git a/xfa/fxbarcode/oned/BC_OnedCode39Reader.cpp b/xfa/fxbarcode/oned/BC_OnedCode39Reader.cpp
index e2f88e7..0eb4c99 100644
--- a/xfa/fxbarcode/oned/BC_OnedCode39Reader.cpp
+++ b/xfa/fxbarcode/oned/BC_OnedCode39Reader.cpp
@@ -38,7 +38,6 @@
     0x04C, 0x01C, 0x103, 0x043, 0x142, 0x013, 0x112, 0x052, 0x007,
     0x106, 0x046, 0x016, 0x181, 0x0C1, 0x1C0, 0x091, 0x190, 0x0D0,
     0x085, 0x184, 0x0C4, 0x094, 0x0A8, 0x0A2, 0x08A, 0x02A};
-const int32_t CBC_OnedCode39Reader::ASTERISK_ENCODING = 0x094;
 
 CBC_OnedCode39Reader::CBC_OnedCode39Reader()
     : m_usingCheckDigit(FALSE), m_extendedMode(FALSE) {}
diff --git a/xfa/fxbarcode/oned/BC_OnedCode39Reader.h b/xfa/fxbarcode/oned/BC_OnedCode39Reader.h
index f1551e4..315ffa6 100644
--- a/xfa/fxbarcode/oned/BC_OnedCode39Reader.h
+++ b/xfa/fxbarcode/oned/BC_OnedCode39Reader.h
@@ -7,30 +7,36 @@
 #ifndef XFA_FXBARCODE_ONED_BC_ONEDCODE39READER_H_
 #define XFA_FXBARCODE_ONED_BC_ONEDCODE39READER_H_
 
-class CBC_OneDReader;
+#include "core/include/fxcrt/fx_system.h"
+#include "xfa/fxbarcode/oned/BC_OneDReader.h"
+
 class CBC_CommonBitArray;
+
 class CBC_OnedCode39Reader : public CBC_OneDReader {
  public:
   static const FX_CHAR* ALPHABET_STRING;
   static const FX_CHAR* CHECKSUM_STRING;
   static const int32_t CHARACTER_ENCODINGS[44];
-  static const int32_t ASTERISK_ENCODING;
+  static const int32_t ASTERISK_ENCODING = 0x094;
+
   CBC_OnedCode39Reader();
-  CBC_OnedCode39Reader(FX_BOOL usingCheckDigit);
+  explicit CBC_OnedCode39Reader(FX_BOOL usingCheckDigit);
   CBC_OnedCode39Reader(FX_BOOL usingCheckDigit, FX_BOOL extendedMode);
   virtual ~CBC_OnedCode39Reader();
+
   CFX_ByteString DecodeRow(int32_t rowNumber,
                            CBC_CommonBitArray* row,
                            int32_t hints,
                            int32_t& e);
 
  private:
-  FX_BOOL m_usingCheckDigit;
-  FX_BOOL m_extendedMode;
   CFX_Int32Array* FindAsteriskPattern(CBC_CommonBitArray* row, int32_t& e);
   int32_t ToNarrowWidePattern(CFX_Int32Array* counters);
   FX_CHAR PatternToChar(int32_t pattern, int32_t& e);
   CFX_ByteString DecodeExtended(CFX_ByteString& encoded, int32_t& e);
+
+  FX_BOOL m_usingCheckDigit;
+  FX_BOOL m_extendedMode;
 };
 
 #endif  // XFA_FXBARCODE_ONED_BC_ONEDCODE39READER_H_
diff --git a/xfa/fxbarcode/oned/BC_OnedCode39Writer.h b/xfa/fxbarcode/oned/BC_OnedCode39Writer.h
index b438727..f2c340b 100644
--- a/xfa/fxbarcode/oned/BC_OnedCode39Writer.h
+++ b/xfa/fxbarcode/oned/BC_OnedCode39Writer.h
@@ -7,13 +7,15 @@
 #ifndef XFA_FXBARCODE_ONED_BC_ONEDCODE39WRITER_H_
 #define XFA_FXBARCODE_ONED_BC_ONEDCODE39WRITER_H_
 
-enum BC_TEXT_LOC;
-class CBC_OneDimWriter;
+#include "xfa/fxbarcode/include/BC_Library.h"
+#include "xfa/fxbarcode/oned/BC_OneDimWriter.h"
+
 class CBC_OnedCode39Writer : public CBC_OneDimWriter {
  public:
   CBC_OnedCode39Writer();
-  CBC_OnedCode39Writer(FX_BOOL extendedMode);
+  explicit CBC_OnedCode39Writer(FX_BOOL extendedMode);
   virtual ~CBC_OnedCode39Writer();
+
   uint8_t* Encode(const CFX_ByteString& contents,
                   BCFORMAT format,
                   int32_t& outWidth,
@@ -33,6 +35,7 @@
                     int32_t codeLength,
                     FX_BOOL isDevice,
                     int32_t& e);
+
   CFX_WideString encodedContents(const CFX_WideStringC& contents, int32_t& e);
   FX_BOOL CheckContentValidity(const CFX_WideStringC& contents);
   FX_BOOL CheckExtendedContentValidity(const CFX_WideStringC& contents);
@@ -46,6 +49,7 @@
  private:
   void ToIntArray(int32_t a, int32_t* toReturn);
   FX_CHAR CalcCheckSum(const CFX_ByteString& contents, int32_t& e);
+
   int32_t m_iWideNarrRatio;
   FX_BOOL m_extendedMode;
 };
diff --git a/xfa/fxbarcode/oned/BC_OnedEAN13Reader.h b/xfa/fxbarcode/oned/BC_OnedEAN13Reader.h
index 0d9d614..4d01e42 100644
--- a/xfa/fxbarcode/oned/BC_OnedEAN13Reader.h
+++ b/xfa/fxbarcode/oned/BC_OnedEAN13Reader.h
@@ -6,12 +6,18 @@
 
 #ifndef XFA_FXBARCODE_ONED_BC_ONEDEAN13READER_H_
 #define XFA_FXBARCODE_ONED_BC_ONEDEAN13READER_H_
-class CBC_OneDimReader;
+
+#include "core/include/fxcrt/fx_string.h"
+#include "core/include/fxcrt/fx_system.h"
+#include "xfa/fxbarcode/oned/BC_OneDimReader.h"
+
 class CBC_CommonBitArray;
-class CBC_OnedEAN13Reader;
+class CBC_OnedUPCAReader;
+
 class CBC_OnedEAN13Reader : public CBC_OneDimReader {
  public:
   static const int32_t FIRST_DIGIT_ENCODINGS[10];
+
   CBC_OnedEAN13Reader();
   virtual ~CBC_OnedEAN13Reader();
 
@@ -21,11 +27,12 @@
                            int32_t& e);
 
  protected:
+  friend class CBC_OnedUPCAReader;
+
   int32_t DecodeMiddle(CBC_CommonBitArray* row,
                        CFX_Int32Array* startRange,
                        CFX_ByteString& resultString,
                        int32_t& e);
-  friend class CBC_OnedUPCAReader;
 };
 
 #endif  // XFA_FXBARCODE_ONED_BC_ONEDEAN13READER_H_
diff --git a/xfa/fxbarcode/oned/BC_OnedEAN13Writer.h b/xfa/fxbarcode/oned/BC_OnedEAN13Writer.h
index fd23129..de17ac7 100644
--- a/xfa/fxbarcode/oned/BC_OnedEAN13Writer.h
+++ b/xfa/fxbarcode/oned/BC_OnedEAN13Writer.h
@@ -7,12 +7,14 @@
 #ifndef XFA_FXBARCODE_ONED_BC_ONEDEAN13WRITER_H_
 #define XFA_FXBARCODE_ONED_BC_ONEDEAN13WRITER_H_
 
-class CBC_OneDimWriter;
-class CBC_OnedEAN13Writer;
-class CBC_OnedEAN13Writer : public CBC_OneDimWriter {
- private:
-  int32_t m_codeWidth;
+#include "core/include/fxcrt/fx_string.h"
+#include "core/include/fxcrt/fx_system.h"
+#include "xfa/fxbarcode/oned/BC_OneDimWriter.h"
 
+class CFX_DIBitmap;
+class CFX_RenderDevice;
+
+class CBC_OnedEAN13Writer : public CBC_OneDimWriter {
  public:
   CBC_OnedEAN13Writer();
   virtual ~CBC_OnedEAN13Writer();
@@ -31,6 +33,7 @@
   uint8_t* Encode(const CFX_ByteString& contents,
                   int32_t& outLength,
                   int32_t& e);
+
   void RenderResult(const CFX_WideStringC& contents,
                     uint8_t* code,
                     int32_t codeLength,
@@ -48,6 +51,9 @@
                  int32_t barWidth,
                  int32_t multiple,
                  int32_t& e);
+
+ private:
+  int32_t m_codeWidth;
 };
 
 #endif  // XFA_FXBARCODE_ONED_BC_ONEDEAN13WRITER_H_
diff --git a/xfa/fxbarcode/oned/BC_OnedEAN8Reader.h b/xfa/fxbarcode/oned/BC_OnedEAN8Reader.h
index fe2d33d..ab2d5e3 100644
--- a/xfa/fxbarcode/oned/BC_OnedEAN8Reader.h
+++ b/xfa/fxbarcode/oned/BC_OnedEAN8Reader.h
@@ -7,9 +7,10 @@
 #ifndef XFA_FXBARCODE_ONED_BC_ONEDEAN8READER_H_
 #define XFA_FXBARCODE_ONED_BC_ONEDEAN8READER_H_
 
-class CBC_OneDimReader;
+#include "xfa/fxbarcode/oned/BC_OneDimReader.h"
+
 class CBC_CommonBitArray;
-class CBC_OnedEAN8Reader;
+
 class CBC_OnedEAN8Reader : public CBC_OneDimReader {
  public:
   CBC_OnedEAN8Reader();
diff --git a/xfa/fxbarcode/oned/BC_OnedEAN8Writer.h b/xfa/fxbarcode/oned/BC_OnedEAN8Writer.h
index fc033ff..9110d94 100644
--- a/xfa/fxbarcode/oned/BC_OnedEAN8Writer.h
+++ b/xfa/fxbarcode/oned/BC_OnedEAN8Writer.h
@@ -7,9 +7,14 @@
 #ifndef XFA_FXBARCODE_ONED_BC_ONEDEAN8WRITER_H_
 #define XFA_FXBARCODE_ONED_BC_ONEDEAN8WRITER_H_
 
-enum BC_TEXT_LOC;
-class CBC_OneDimWriter;
-class CBC_OnedEAN8Writer;
+#include "core/include/fxcrt/fx_string.h"
+#include "core/include/fxcrt/fx_system.h"
+#include "xfa/fxbarcode/include/BC_Library.h"
+#include "xfa/fxbarcode/oned/BC_OneDimWriter.h"
+
+class CFX_DIBitmap;
+class CFX_RenderDevice;
+
 class CBC_OnedEAN8Writer : public CBC_OneDimWriter {
  private:
   int32_t m_codeWidth;
@@ -17,6 +22,7 @@
  public:
   CBC_OnedEAN8Writer();
   virtual ~CBC_OnedEAN8Writer();
+
   uint8_t* Encode(const CFX_ByteString& contents,
                   BCFORMAT format,
                   int32_t& outWidth,
@@ -31,6 +37,7 @@
   uint8_t* Encode(const CFX_ByteString& contents,
                   int32_t& outLength,
                   int32_t& e);
+
   void RenderResult(const CFX_WideStringC& contents,
                     uint8_t* code,
                     int32_t codeLength,
diff --git a/xfa/fxbarcode/oned/BC_OnedUPCAReader.h b/xfa/fxbarcode/oned/BC_OnedUPCAReader.h
index 306683e..4d3f479 100644
--- a/xfa/fxbarcode/oned/BC_OnedUPCAReader.h
+++ b/xfa/fxbarcode/oned/BC_OnedUPCAReader.h
@@ -7,18 +7,21 @@
 #ifndef XFA_FXBARCODE_ONED_BC_ONEDUPCAREADER_H_
 #define XFA_FXBARCODE_ONED_BC_ONEDUPCAREADER_H_
 
+#include "core/include/fxcrt/fx_string.h"
+#include "core/include/fxcrt/fx_system.h"
+#include "xfa/fxbarcode/oned/BC_OneDimReader.h"
+
 class CBC_BinaryBitmap;
 class CBC_CommonBitArray;
-class CBC_OneDimReader;
 class CBC_OnedEAN13Reader;
-class CBC_OnedUPCAReader;
-class CBC_OnedUPCAReader : public CBC_OneDimReader {
- private:
-  CBC_OnedEAN13Reader* m_ean13Reader;
 
+class CBC_OnedUPCAReader : public CBC_OneDimReader {
  public:
   CBC_OnedUPCAReader();
   virtual ~CBC_OnedUPCAReader();
+
+  virtual void Init();
+
   CFX_ByteString DecodeRow(int32_t rowNumber,
                            CBC_CommonBitArray* row,
                            int32_t hints,
@@ -30,7 +33,6 @@
                            int32_t& e);
   CFX_ByteString Decode(CBC_BinaryBitmap* image, int32_t& e);
   CFX_ByteString Decode(CBC_BinaryBitmap* image, int32_t hints, int32_t& e);
-  virtual void Init();
 
  protected:
   int32_t DecodeMiddle(CBC_CommonBitArray* row,
@@ -38,6 +40,10 @@
                        CFX_ByteString& resultString,
                        int32_t& e);
   CFX_ByteString MaybeReturnResult(CFX_ByteString& result, int32_t& e);
+
+ private:
+  CBC_OnedEAN13Reader* m_ean13Reader;
+
 };
 
 #endif  // XFA_FXBARCODE_ONED_BC_ONEDUPCAREADER_H_
diff --git a/xfa/fxbarcode/oned/BC_OnedUPCAWriter.h b/xfa/fxbarcode/oned/BC_OnedUPCAWriter.h
index f376929..38f3ca5 100644
--- a/xfa/fxbarcode/oned/BC_OnedUPCAWriter.h
+++ b/xfa/fxbarcode/oned/BC_OnedUPCAWriter.h
@@ -7,16 +7,22 @@
 #ifndef XFA_FXBARCODE_ONED_BC_ONEDUPCAWRITER_H_
 #define XFA_FXBARCODE_ONED_BC_ONEDUPCAWRITER_H_
 
-class CBC_OnedEAN13Writer;
-class CBC_OnedUPCAWriter;
-class CBC_OnedUPCAWriter : public CBC_OneDimWriter {
- private:
-  CBC_OnedEAN13Writer* m_subWriter;
+#include "core/include/fxcrt/fx_string.h"
+#include "core/include/fxcrt/fx_system.h"
+#include "xfa/fxbarcode/oned/BC_OneDimWriter.h"
 
+class CBC_OnedEAN13Writer;
+class CFX_DIBitmap;
+class CFX_Matrix;
+class CFX_RenderDevice;
+
+class CBC_OnedUPCAWriter : public CBC_OneDimWriter {
  public:
   CBC_OnedUPCAWriter();
   virtual ~CBC_OnedUPCAWriter();
+
   virtual void Init();
+
   uint8_t* Encode(const CFX_ByteString& contents,
                   BCFORMAT format,
                   int32_t& outWidth,
@@ -33,6 +39,7 @@
                   int32_t& e) {
     return nullptr;
   }
+
   void RenderResult(const CFX_WideStringC& contents,
                     uint8_t* code,
                     int32_t codeLength,
@@ -50,6 +57,9 @@
                  int32_t barWidth,
                  int32_t multiple,
                  int32_t& e);
+
+ private:
+  CBC_OnedEAN13Writer* m_subWriter;
 };
 
 #endif  // XFA_FXBARCODE_ONED_BC_ONEDUPCAWRITER_H_
diff --git a/xfa/fxbarcode/pdf417/BC_PDF417Reader.h b/xfa/fxbarcode/pdf417/BC_PDF417Reader.h
index 2a5c39b..f1e0eda 100644
--- a/xfa/fxbarcode/pdf417/BC_PDF417Reader.h
+++ b/xfa/fxbarcode/pdf417/BC_PDF417Reader.h
@@ -7,9 +7,13 @@
 #ifndef XFA_FXBARCODE_PDF417_BC_PDF417READER_H_
 #define XFA_FXBARCODE_PDF417_BC_PDF417READER_H_
 
+#include "core/include/fxcrt/fx_string.h"
+#include "core/include/fxcrt/fx_system.h"
+#include "xfa/fxbarcode/BC_Reader.h"
+
 class CBC_BinaryBitmap;
 class CBC_ResultPoint;
-class CBC_PDF417Reader;
+
 class CBC_PDF417Reader : public CBC_Reader {
  public:
   CBC_PDF417Reader();
diff --git a/xfa/fxbarcode/pdf417/BC_PDF417Writer.h b/xfa/fxbarcode/pdf417/BC_PDF417Writer.h
index f92f57b..bc646b8 100644
--- a/xfa/fxbarcode/pdf417/BC_PDF417Writer.h
+++ b/xfa/fxbarcode/pdf417/BC_PDF417Writer.h
@@ -7,8 +7,10 @@
 #ifndef XFA_FXBARCODE_PDF417_BC_PDF417WRITER_H_
 #define XFA_FXBARCODE_PDF417_BC_PDF417WRITER_H_
 
-class CBC_TwoDimWriter;
-class CBC_PDF417Writer;
+#include "core/include/fxcrt/fx_string.h"
+#include "core/include/fxcrt/fx_system.h"
+#include "xfa/fxbarcode/BC_TwoDimWriter.h"
+
 class CBC_PDF417Writer : public CBC_TwoDimWriter {
  public:
   CBC_PDF417Writer();
diff --git a/xfa/fxfa/app/xfa_ffbarcode.h b/xfa/fxfa/app/xfa_ffbarcode.h
index 114a492..cd390e8 100644
--- a/xfa/fxfa/app/xfa_ffbarcode.h
+++ b/xfa/fxfa/app/xfa_ffbarcode.h
@@ -7,9 +7,9 @@
 #ifndef XFA_FXFA_APP_XFA_FFBARCODE_H_
 #define XFA_FXFA_APP_XFA_FFBARCODE_H_
 
+#include "xfa/fxbarcode/include/BC_Library.h"
 #include "xfa/fxfa/app/xfa_ffpageview.h"
 #include "xfa/fxfa/app/xfa_fftextedit.h"
-#include "xfa/include/fxbarcode/BC_BarCode.h"
 
 class CXFA_FFBarcode : public CXFA_FFTextEdit {
  public:
diff --git a/xfa/fxfa/parser/xfa_objectacc_imp.cpp b/xfa/fxfa/parser/xfa_objectacc_imp.cpp
index 104fc04..1e86e73 100644
--- a/xfa/fxfa/parser/xfa_objectacc_imp.cpp
+++ b/xfa/fxfa/parser/xfa_objectacc_imp.cpp
@@ -5,6 +5,7 @@
 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
 
 #include "core/include/fxcrt/fx_ext.h"
+#include "xfa/fxbarcode/include/BC_Library.h"
 #include "xfa/fxfa/fm2js/xfa_fm2jsapi.h"
 #include "xfa/fxfa/parser/xfa_docdata.h"
 #include "xfa/fxfa/parser/xfa_doclayout.h"
@@ -15,7 +16,6 @@
 #include "xfa/fxfa/parser/xfa_parser.h"
 #include "xfa/fxfa/parser/xfa_script.h"
 #include "xfa/fxfa/parser/xfa_utils.h"
-#include "xfa/include/fxbarcode/BC_BarCode.h"
 
 static FX_ARGB XFA_WStringToColor(const CFX_WideStringC& wsValue) {
   uint8_t r = 0, g = 0, b = 0;
diff --git a/xfa/include/fwl/basewidget/fwl_barcode.h b/xfa/include/fwl/basewidget/fwl_barcode.h
index 944dd4a..0d3db83 100644
--- a/xfa/include/fwl/basewidget/fwl_barcode.h
+++ b/xfa/include/fwl/basewidget/fwl_barcode.h
@@ -7,11 +7,11 @@
 #ifndef XFA_INCLUDE_FWL_BASEWIDGET_FWL_BARCODE_H_
 #define XFA_INCLUDE_FWL_BASEWIDGET_FWL_BARCODE_H_
 
+#include "xfa/fxbarcode/include/BC_Library.h"
 #include "xfa/include/fwl/basewidget/fwl_edit.h"
-#include "xfa/include/fxbarcode/BC_BarCode.h"
 
 class CFWL_WidgetImpProperties;
-class IFWL_Barcode;
+
 #define FWL_CLASS_Barcode L"FWL_BARCODE"
 #define FWL_CLASSHASH_Barcode 366886968
 #define FWL_BCDATTRIBUTE_CHARENCODING (1L << 0)
@@ -31,6 +31,7 @@
 #define FWL_PART_BCD_Edge 2
 #define FWL_PART_BCD_Background 3
 #define FWL_BCUPDATECMD_Data FWL_WGTUPDATECMD_User
+
 class IFWL_BarcodeDP : public IFWL_EditDP {
  public:
   virtual BC_CHAR_ENCODING GetCharEncoding() = 0;
diff --git a/xfa/include/fwl/basewidget/fxmath_barcode.h b/xfa/include/fwl/basewidget/fxmath_barcode.h
index c6ef766..58ce117 100644
--- a/xfa/include/fwl/basewidget/fxmath_barcode.h
+++ b/xfa/include/fwl/basewidget/fxmath_barcode.h
@@ -7,12 +7,21 @@
 #ifndef XFA_INCLUDE_FWL_BASEWIDGET_FXMATH_BARCODE_H_
 #define XFA_INCLUDE_FWL_BASEWIDGET_FXMATH_BARCODE_H_
 
-#include "xfa/include/fxbarcode/BC_BarCode.h"
+#include "core/include/fxcrt/fx_string.h"
+#include "core/include/fxcrt/fx_system.h"
+#include "core/include/fxge/fx_dib.h"
+#include "xfa/fxbarcode/include/BC_Library.h"
+
+class CFX_Font;
+class CFX_Matrix;
+class CFX_RenderDevice;
 
 class IFX_Barcode {
  public:
   virtual ~IFX_Barcode() {}
+
   virtual void Release() = 0;
+
   virtual BC_TYPE GetType() = 0;
   virtual FX_BOOL Encode(const CFX_WideStringC& contents,
                          FX_BOOL isDevice,
@@ -47,6 +56,7 @@
   virtual FX_BOOL SetErrorCorrectionLevel(int32_t level) = 0;
   virtual FX_BOOL SetTruncated(FX_BOOL truncated) = 0;
 };
+
 IFX_Barcode* FX_Barcode_Create(BC_TYPE type);
 
 #endif  // XFA_INCLUDE_FWL_BASEWIDGET_FXMATH_BARCODE_H_
diff --git a/xfa/include/fwl/lightwidget/barcode.h b/xfa/include/fwl/lightwidget/barcode.h
index 2dec2a8..7056f3a 100644
--- a/xfa/include/fwl/lightwidget/barcode.h
+++ b/xfa/include/fwl/lightwidget/barcode.h
@@ -10,7 +10,6 @@
 #include "xfa/include/fwl/basewidget/fwl_barcode.h"
 #include "xfa/include/fwl/core/fwl_error.h"
 #include "xfa/include/fwl/lightwidget/edit.h"
-#include "xfa/include/fxbarcode/BC_BarCode.h"
 
 class CFWL_Widget;
 class CFWL_WidgetProperties;
diff --git a/xfa/include/fxbarcode/BC_BarCode.h b/xfa/include/fxbarcode/BC_BarCode.h
deleted file mode 100644
index 84745ac..0000000
--- a/xfa/include/fxbarcode/BC_BarCode.h
+++ /dev/null
@@ -1,257 +0,0 @@
-// Copyright 2014 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 XFA_INCLUDE_FXBARCODE_BC_BARCODE_H_
-#define XFA_INCLUDE_FXBARCODE_BC_BARCODE_H_
-
-#include "core/include/fxcrt/fx_string.h"
-#include "core/include/fxcrt/fx_system.h"
-#include "core/include/fxge/fx_dib.h"
-
-class CBC_Reader;
-class CBC_Writer;
-class CFX_Font;
-class CFX_RenderDevice;
-
-enum BC_TEXT_LOC {
-  BC_TEXT_LOC_NONE = 0,
-  BC_TEXT_LOC_ABOVE,
-  BC_TEXT_LOC_BELOW,
-  BC_TEXT_LOC_ABOVEEMBED,
-  BC_TEXT_LOC_BELOWEMBED
-};
-
-enum BC_CHAR_ENCODING { CHAR_ENCODING_UTF8 = 0, CHAR_ENCODING_UNICODE };
-
-enum BC_TYPE {
-  BC_UNKNOWN = -1,
-  BC_CODE39 = 0,
-  BC_CODABAR,
-  BC_CODE128,
-  BC_CODE128_B,
-  BC_CODE128_C,
-  BC_EAN8,
-  BC_UPCA,
-  BC_EAN13,
-  BC_QR_CODE,
-  BC_PDF417,
-  BC_DATAMATRIX
-};
-
-void BC_Library_Init();
-void BC_Library_Destory();
-
-class CBC_CodeBase {
- public:
-  CBC_CodeBase();
-  virtual ~CBC_CodeBase();
-  virtual BC_TYPE GetType() = 0;
-  virtual FX_BOOL Encode(const CFX_WideStringC& contents,
-                         FX_BOOL isDevice,
-                         int32_t& e) = 0;
-  virtual FX_BOOL RenderDevice(CFX_RenderDevice* device,
-                               const CFX_Matrix* matirx,
-                               int32_t& e) = 0;
-  virtual FX_BOOL RenderBitmap(CFX_DIBitmap*& pOutBitmap, int32_t& e) = 0;
-  virtual CFX_WideString Decode(uint8_t* buf,
-                                int32_t width,
-                                int32_t hight,
-                                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);
-
- protected:
-  CBC_Writer* m_pBCWriter;
-  CBC_Reader* m_pBCReader;
-};
-class CBC_OneCode : public CBC_CodeBase {
- public:
-  CBC_OneCode();
-  virtual ~CBC_OneCode();
-  virtual BC_TYPE GetType() = 0;
-  virtual FX_BOOL Encode(const CFX_WideStringC& contents,
-                         FX_BOOL isDevice,
-                         int32_t& e) = 0;
-  virtual FX_BOOL RenderDevice(CFX_RenderDevice* device,
-                               const CFX_Matrix* matirx,
-                               int32_t& e) = 0;
-  virtual FX_BOOL RenderBitmap(CFX_DIBitmap*& pOutBitmap, int32_t& e) = 0;
-  virtual CFX_WideString Decode(uint8_t* buf,
-                                int32_t width,
-                                int32_t hight,
-                                int32_t& e) = 0;
-  virtual CFX_WideString Decode(CFX_DIBitmap* pBitmap, int32_t& e) = 0;
-  virtual FX_BOOL CheckContentValidity(const CFX_WideStringC& contents);
-  virtual CFX_WideString FilterContents(const CFX_WideStringC& contents);
-  virtual void SetPrintChecksum(FX_BOOL checksum);
-  virtual void SetDataLength(int32_t length);
-  virtual void SetCalChecksum(FX_BOOL calc);
-  virtual FX_BOOL SetFont(CFX_Font* cFont);
-  virtual void SetFontSize(FX_FLOAT size);
-  virtual void SetFontStyle(int32_t style);
-  virtual void SetFontColor(FX_ARGB color);
-};
-class CBC_Code39 : public CBC_OneCode {
- public:
-  CBC_Code39();
-  CBC_Code39(FX_BOOL usingCheckDigit);
-  CBC_Code39(FX_BOOL usingCheckDigit, FX_BOOL extendedMode);
-  virtual ~CBC_Code39();
-  FX_BOOL Encode(const CFX_WideStringC& contents, FX_BOOL isDevice, int32_t& e);
-  FX_BOOL RenderDevice(CFX_RenderDevice* device,
-                       const CFX_Matrix* matirx,
-                       int32_t& e);
-  FX_BOOL RenderBitmap(CFX_DIBitmap*& pOutBitmap, int32_t& e);
-  CFX_WideString Decode(uint8_t* buf, int32_t width, int32_t hight, int32_t& e);
-  CFX_WideString Decode(CFX_DIBitmap* pBitmap, int32_t& e);
-  BC_TYPE GetType() { return BC_CODE39; }
-  FX_BOOL SetTextLocation(BC_TEXT_LOC location);
-  FX_BOOL SetWideNarrowRatio(int32_t ratio);
-
- private:
-  CFX_WideString m_renderContents;
-};
-class CBC_Codabar : public CBC_OneCode {
- public:
-  CBC_Codabar();
-  virtual ~CBC_Codabar();
-  FX_BOOL Encode(const CFX_WideStringC& contents, FX_BOOL isDevice, int32_t& e);
-  FX_BOOL RenderDevice(CFX_RenderDevice* device,
-                       const CFX_Matrix* matirx,
-                       int32_t& e);
-  FX_BOOL RenderBitmap(CFX_DIBitmap*& pOutBitmap, int32_t& e);
-  CFX_WideString Decode(uint8_t* buf, int32_t width, int32_t hight, int32_t& e);
-  CFX_WideString Decode(CFX_DIBitmap* pBitmap, int32_t& e);
-  BC_TYPE GetType() { return BC_CODABAR; }
-  FX_BOOL SetStartChar(FX_CHAR start);
-  FX_BOOL SetEndChar(FX_CHAR end);
-  FX_BOOL SetTextLocation(BC_TEXT_LOC location);
-  FX_BOOL SetWideNarrowRatio(int32_t ratio);
-
- private:
-  CFX_WideString m_renderContents;
-};
-class CBC_Code128 : public CBC_OneCode {
- public:
-  CBC_Code128(BC_TYPE type);
-  virtual ~CBC_Code128();
-  FX_BOOL Encode(const CFX_WideStringC& contents, FX_BOOL isDevice, int32_t& e);
-  FX_BOOL RenderDevice(CFX_RenderDevice* device,
-                       const CFX_Matrix* matirx,
-                       int32_t& e);
-  FX_BOOL RenderBitmap(CFX_DIBitmap*& pOutBitmap, int32_t& e);
-  CFX_WideString Decode(uint8_t* buf, int32_t width, int32_t hight, int32_t& e);
-  CFX_WideString Decode(CFX_DIBitmap* pBitmap, int32_t& e);
-  BC_TYPE GetType() { return BC_CODE128; }
-  FX_BOOL SetTextLocation(BC_TEXT_LOC loction);
-
- private:
-  CFX_WideString m_renderContents;
-};
-class CBC_EAN8 : public CBC_OneCode {
- public:
-  CBC_EAN8();
-  virtual ~CBC_EAN8();
-  FX_BOOL Encode(const CFX_WideStringC& contents, FX_BOOL isDevice, int32_t& e);
-  FX_BOOL RenderDevice(CFX_RenderDevice* device,
-                       const CFX_Matrix* matirx,
-                       int32_t& e);
-  FX_BOOL RenderBitmap(CFX_DIBitmap*& pOutBitmap, int32_t& e);
-  CFX_WideString Decode(uint8_t* buf, int32_t width, int32_t hight, int32_t& e);
-  CFX_WideString Decode(CFX_DIBitmap* pBitmap, int32_t& e);
-  BC_TYPE GetType() { return BC_EAN8; }
-
- private:
-  CFX_WideString Preprocess(const CFX_WideStringC& contents);
-  CFX_WideString m_renderContents;
-};
-class CBC_EAN13 : public CBC_OneCode {
- public:
-  CBC_EAN13();
-  virtual ~CBC_EAN13();
-  FX_BOOL Encode(const CFX_WideStringC& contents, FX_BOOL isDevice, int32_t& e);
-  FX_BOOL RenderDevice(CFX_RenderDevice* device,
-                       const CFX_Matrix* matirx,
-                       int32_t& e);
-  FX_BOOL RenderBitmap(CFX_DIBitmap*& pOutBitmap, int32_t& e);
-  CFX_WideString Decode(uint8_t* buf, int32_t width, int32_t hight, int32_t& e);
-  CFX_WideString Decode(CFX_DIBitmap* pBitmap, int32_t& e);
-  BC_TYPE GetType() { return BC_EAN13; }
-
- private:
-  CFX_WideString Preprocess(const CFX_WideStringC& contents);
-  CFX_WideString m_renderContents;
-};
-class CBC_UPCA : public CBC_OneCode {
- public:
-  CBC_UPCA();
-  virtual ~CBC_UPCA();
-  FX_BOOL Encode(const CFX_WideStringC& contents, FX_BOOL isDevice, int32_t& e);
-  FX_BOOL RenderDevice(CFX_RenderDevice* device,
-                       const CFX_Matrix* matirx,
-                       int32_t& e);
-  FX_BOOL RenderBitmap(CFX_DIBitmap*& pOutBitmap, int32_t& e);
-  CFX_WideString Decode(uint8_t* buf, int32_t width, int32_t hight, int32_t& e);
-  CFX_WideString Decode(CFX_DIBitmap* pBitmap, int32_t& e);
-  BC_TYPE GetType() { return BC_UPCA; }
-
- private:
-  CFX_WideString Preprocess(const CFX_WideStringC& contents);
-  CFX_WideString m_renderContents;
-};
-class CBC_QRCode : public CBC_CodeBase {
- public:
-  CBC_QRCode();
-  virtual ~CBC_QRCode();
-  FX_BOOL Encode(const CFX_WideStringC& contents, FX_BOOL isDevice, int32_t& e);
-  FX_BOOL RenderDevice(CFX_RenderDevice* device,
-                       const CFX_Matrix* matirx,
-                       int32_t& e);
-  FX_BOOL RenderBitmap(CFX_DIBitmap*& pOutBitmap, int32_t& e);
-  CFX_WideString Decode(uint8_t* buf, int32_t width, int32_t hight, int32_t& e);
-  CFX_WideString Decode(CFX_DIBitmap* pBitmap, int32_t& e);
-  BC_TYPE GetType() { return BC_QR_CODE; }
-  FX_BOOL SetVersion(int32_t version);
-  FX_BOOL SetErrorCorrectionLevel(int32_t level);
-};
-class CBC_PDF417I : public CBC_CodeBase {
- public:
-  CBC_PDF417I();
-  virtual ~CBC_PDF417I();
-  FX_BOOL Encode(const CFX_WideStringC& contents, FX_BOOL isDevice, int32_t& e);
-  FX_BOOL RenderDevice(CFX_RenderDevice* device,
-                       const CFX_Matrix* matirx,
-                       int32_t& e);
-  FX_BOOL RenderBitmap(CFX_DIBitmap*& pOutBitmap, int32_t& e);
-  CFX_WideString Decode(uint8_t* buf, int32_t width, int32_t hight, int32_t& e);
-  CFX_WideString Decode(CFX_DIBitmap* pBitmap, int32_t& e);
-  BC_TYPE GetType() { return BC_PDF417; }
-  FX_BOOL SetErrorCorrectionLevel(int32_t level);
-  void SetTruncated(FX_BOOL truncated);
-};
-class CBC_DataMatrix : public CBC_CodeBase {
- public:
-  CBC_DataMatrix();
-  virtual ~CBC_DataMatrix();
-  FX_BOOL Encode(const CFX_WideStringC& contents, FX_BOOL isDevice, int32_t& e);
-  FX_BOOL RenderDevice(CFX_RenderDevice* device,
-                       const CFX_Matrix* matirx,
-                       int32_t& e);
-  FX_BOOL RenderBitmap(CFX_DIBitmap*& pOutBitmap, int32_t& e);
-  CFX_WideString Decode(uint8_t* buf, int32_t width, int32_t hight, int32_t& e);
-  CFX_WideString Decode(CFX_DIBitmap* pBitmap, int32_t& e);
-  BC_TYPE GetType() { return BC_DATAMATRIX; }
-};
-
-#endif  // XFA_INCLUDE_FXBARCODE_BC_BARCODE_H_
