// 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 _BC_QRCODER_H_
#define _BC_QRCODER_H_
class CBC_QRCoderErrorCorrectionLevel;
class CBC_QRCoderMode;
class CBC_CommonByteMatrix;

class CBC_QRCoder {
 private:
  CBC_QRCoderMode* m_mode;
  CBC_QRCoderErrorCorrectionLevel* m_ecLevel;
  int32_t m_version;
  int32_t m_matrixWidth;
  int32_t m_maskPattern;
  int32_t m_numTotalBytes;
  int32_t m_numDataBytes;
  int32_t m_numECBytes;
  int32_t m_numRSBlocks;
  CBC_CommonByteMatrix* m_matrix;

 public:
  const static int32_t NUM_MASK_PATTERNS;
  CBC_QRCoder();
  virtual ~CBC_QRCoder();
  CBC_QRCoderMode* GetMode();
  CBC_QRCoderErrorCorrectionLevel* GetECLevel();
  int32_t GetVersion();
  int32_t GetMatrixWidth();
  int32_t GetMaskPattern();
  int32_t GetNumTotalBytes();
  int32_t GetNumDataBytes();
  int32_t GetNumECBytes();
  int32_t GetNumRSBlocks();
  CBC_CommonByteMatrix* GetMatrix();
  int32_t At(int32_t x, int32_t y, int32_t& e);
  FX_BOOL IsValid();

  void SetMode(CBC_QRCoderMode* value);
  void SetECLevel(CBC_QRCoderErrorCorrectionLevel* ecLevel);
  void SetVersion(int32_t version);
  void SetMatrixWidth(int32_t width);
  void SetMaskPattern(int32_t pattern);
  void SetNumDataBytes(int32_t bytes);
  void SetNumTotalBytes(int32_t value);
  void SetNumECBytes(int32_t value);
  void SetNumRSBlocks(int32_t block);
  void SetMatrix(CBC_CommonByteMatrix* value);
  static FX_BOOL IsValidMaskPattern(int32_t maskPattern);
};
#endif
