// 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_PDF417_BC_PDF417SCANNINGDECODER_H_
#define XFA_FXBARCODE_PDF417_BC_PDF417SCANNINGDECODER_H_

#include "xfa/fxbarcode/pdf417/BC_PDF417BarcodeValue.h"

class CBC_CommonDecoderResult;
class CBC_CommonBitMatrix;
class CBC_Codeword;
class CBC_BoundingBox;
class CBC_ResultPoint;
class CBC_BarcodeMetadata;
class CBC_DetectionResult;
class CBC_DetectionResultRowIndicatorColumn;

class CBC_PDF417ScanningDecoder {
 public:
  CBC_PDF417ScanningDecoder();
  virtual ~CBC_PDF417ScanningDecoder();
  static void Initialize();
  static void Finalize();
  static CBC_CommonDecoderResult* decode(CBC_CommonBitMatrix* image,
                                         CBC_ResultPoint* imageTopLeft,
                                         CBC_ResultPoint* imageBottomLeft,
                                         CBC_ResultPoint* imageTopRight,
                                         CBC_ResultPoint* imageBottomRight,
                                         int32_t minCodewordWidth,
                                         int32_t maxCodewordWidth,
                                         int32_t& e);
  static CFX_ByteString toString(CBC_BarcodeValueArrayArray* barcodeMatrix);

 private:
  static int32_t CODEWORD_SKEW_SIZE;
  static int32_t MAX_ERRORS;
  static int32_t MAX_EC_CODEWORDS;
  static CBC_PDF417ECErrorCorrection* errorCorrection;
  static CBC_DetectionResult* merge(
      CBC_DetectionResultRowIndicatorColumn* leftRowIndicatorColumn,
      CBC_DetectionResultRowIndicatorColumn* rightRowIndicatorColumn,
      int32_t& e);
  static CBC_BoundingBox* adjustBoundingBox(
      CBC_DetectionResultRowIndicatorColumn* rowIndicatorColumn,
      int32_t& e);
  static int32_t getMax(CFX_Int32Array& values);
  static CBC_BarcodeMetadata* getBarcodeMetadata(
      CBC_DetectionResultRowIndicatorColumn* leftRowIndicatorColumn,
      CBC_DetectionResultRowIndicatorColumn* rightRowIndicatorColumn);
  static CBC_DetectionResultRowIndicatorColumn* getRowIndicatorColumn(
      CBC_CommonBitMatrix* image,
      CBC_BoundingBox* boundingBox,
      CBC_ResultPoint startPoint,
      FX_BOOL leftToRight,
      int32_t minCodewordWidth,
      int32_t maxCodewordWidth);
  static void adjustCodewordCount(CBC_DetectionResult* detectionResult,
                                  CBC_BarcodeValueArrayArray* barcodeMatrix,
                                  int32_t& e);
  static CBC_CommonDecoderResult* createDecoderResult(
      CBC_DetectionResult* detectionResult,
      int32_t& e);
  static CBC_CommonDecoderResult* createDecoderResultFromAmbiguousValues(
      int32_t ecLevel,
      CFX_Int32Array& codewords,
      CFX_Int32Array& erasureArray,
      CFX_Int32Array& ambiguousIndexes,
      CFX_ArrayTemplate<CFX_Int32Array*>& ambiguousIndexValues,
      int32_t& e);
  static CBC_BarcodeValueArrayArray* createBarcodeMatrix(
      CBC_DetectionResult* detectionResult);
  static FX_BOOL isValidBarcodeColumn(CBC_DetectionResult* detectionResult,
                                      int32_t barcodeColumn);
  static int32_t getStartColumn(CBC_DetectionResult* detectionResult,
                                int32_t barcodeColumn,
                                int32_t imageRow,
                                FX_BOOL leftToRight);
  static CBC_Codeword* detectCodeword(CBC_CommonBitMatrix* image,
                                      int32_t minColumn,
                                      int32_t maxColumn,
                                      FX_BOOL leftToRight,
                                      int32_t startColumn,
                                      int32_t imageRow,
                                      int32_t minCodewordWidth,
                                      int32_t maxCodewordWidth);
  static CFX_Int32Array* getModuleBitCount(CBC_CommonBitMatrix* image,
                                           int32_t minColumn,
                                           int32_t maxColumn,
                                           FX_BOOL leftToRight,
                                           int32_t startColumn,
                                           int32_t imageRow);
  static int32_t getNumberOfECCodeWords(int32_t barcodeECLevel);
  static int32_t adjustCodewordStartColumn(CBC_CommonBitMatrix* image,
                                           int32_t minColumn,
                                           int32_t maxColumn,
                                           FX_BOOL leftToRight,
                                           int32_t codewordStartColumn,
                                           int32_t imageRow);
  static FX_BOOL checkCodewordSkew(int32_t codewordSize,
                                   int32_t minCodewordWidth,
                                   int32_t maxCodewordWidth);
  static CBC_CommonDecoderResult* decodeCodewords(CFX_Int32Array& codewords,
                                                  int32_t ecLevel,
                                                  CFX_Int32Array& erasures,
                                                  int32_t& e);
  static int32_t correctErrors(CFX_Int32Array& codewords,
                               CFX_Int32Array& erasures,
                               int32_t numECCodewords,
                               int32_t& e);
  static void verifyCodewordCount(CFX_Int32Array& codewords,
                                  int32_t numECCodewords,
                                  int32_t& e);
  static CFX_Int32Array* getBitCountForCodeword(int32_t codeword);
  static int32_t getCodewordBucketNumber(int32_t codeword);
  static int32_t getCodewordBucketNumber(CFX_Int32Array& moduleBitCount);
};

#endif  // XFA_FXBARCODE_PDF417_BC_PDF417SCANNINGDECODER_H_
