// 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_FXBARCODE_ONED_BC_ONEDUPCAREADER_H_
#define XFA_FXBARCODE_ONED_BC_ONEDUPCAREADER_H_

#include "core/fxcrt/include/fx_string.h"
#include "core/fxcrt/include/fx_system.h"
#include "xfa/fxbarcode/oned/BC_OneDimReader.h"

class CBC_BinaryBitmap;
class CBC_CommonBitArray;
class CBC_OnedEAN13Reader;

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,
                           int32_t& e);
  CFX_ByteString DecodeRow(int32_t rowNumber,
                           CBC_CommonBitArray* row,
                           CFX_Int32Array* startGuardRange,
                           int32_t hints,
                           int32_t& e);
  CFX_ByteString Decode(CBC_BinaryBitmap* image, int32_t& e);
  CFX_ByteString Decode(CBC_BinaryBitmap* image, int32_t hints, int32_t& e);

 protected:
  int32_t DecodeMiddle(CBC_CommonBitArray* row,
                       CFX_Int32Array* startRange,
                       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_
