// 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_SRC_FXBARCODE_DATAMATRIX_BC_DATAMATRIXBITMATRIXPARSER_H_
#define XFA_SRC_FXBARCODE_DATAMATRIX_BC_DATAMATRIXBITMATRIXPARSER_H_

#include "core/include/fxcrt/fx_basic.h"

class CBC_CommonBitMatrix;
class CBC_DataMatrixVersion;

class CBC_DataMatrixBitMatrixParser {
 public:
  CBC_DataMatrixBitMatrixParser();
  virtual ~CBC_DataMatrixBitMatrixParser();
  CBC_DataMatrixVersion* GetVersion();
  CFX_ByteArray* ReadCodewords(int32_t& e);
  FX_BOOL ReadModule(int32_t row,
                     int32_t column,
                     int32_t numRows,
                     int32_t numColumns);
  int32_t ReadUtah(int32_t row,
                   int32_t column,
                   int32_t numRows,
                   int32_t numColumns);
  int32_t ReadCorner1(int32_t numRows, int32_t numColumns);
  int32_t ReadCorner2(int32_t numRows, int32_t numColumns);
  int32_t ReadCorner3(int32_t numRows, int32_t numColumns);
  int32_t ReadCorner4(int32_t numRows, int32_t numColumns);
  CBC_CommonBitMatrix* ExtractDataRegion(CBC_CommonBitMatrix* bitMatrix,
                                         int32_t& e);
  virtual void Init(CBC_CommonBitMatrix* bitMatrix, int32_t& e);

 private:
  static CBC_DataMatrixVersion* ReadVersion(CBC_CommonBitMatrix* bitMatrix,
                                            int32_t& e);
  CBC_CommonBitMatrix* m_mappingBitMatrix;
  CBC_CommonBitMatrix* m_readMappingMatrix;
  CBC_DataMatrixVersion* m_version;
};

#endif  // XFA_SRC_FXBARCODE_DATAMATRIX_BC_DATAMATRIXBITMATRIXPARSER_H_
