// 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_ERRORCORRECTION_H_
#define _BC_ERRORCORRECTION_H_
class CBC_SymbolInfo;
class CBC_ErrorCorrection {
 public:
  CBC_ErrorCorrection();
  virtual ~CBC_ErrorCorrection();
  static void Initialize();
  static void Finalize();
  static CFX_WideString encodeECC200(CFX_WideString codewords,
                                     CBC_SymbolInfo* symbolInfo,
                                     int32_t& e);

 private:
  static int32_t FACTOR_SETS[];
  static int32_t FACTORS[][100];
  static int32_t MODULO_VALUE;
  static int32_t LOG[256];
  static int32_t ALOG[256];

 private:
  static CFX_WideString createECCBlock(CFX_WideString codewords,
                                       int32_t numECWords,
                                       int32_t& e);
  static CFX_WideString createECCBlock(CFX_WideString codewords,
                                       int32_t start,
                                       int32_t len,
                                       int32_t numECWords,
                                       int32_t& e);
};
#endif
