// 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_QRCODE_BC_QRALIGNMENTPATTERNFINDER_H_
#define XFA_FXBARCODE_QRCODE_BC_QRALIGNMENTPATTERNFINDER_H_

#include "core/fxcrt/include/fx_basic.h"
#include "xfa/fxbarcode/utils.h"

class CBC_CommonBitMatrix;
class CBC_QRAlignmentPattern;

class CBC_QRAlignmentPatternFinder {
 public:
  CBC_QRAlignmentPatternFinder(CBC_CommonBitMatrix* image,
                               int32_t startX,
                               int32_t startY,
                               int32_t width,
                               int32_t height,
                               FX_FLOAT moduleSize);
  virtual ~CBC_QRAlignmentPatternFinder();
  FX_BOOL FoundPatternCross(const CFX_Int32Array& stateCount);
  FX_FLOAT CrossCheckVertical(int32_t startI,
                              int32_t startJ,
                              int32_t maxCount,
                              int32_t originalStateCountTotal);
  CBC_QRAlignmentPattern* Find(int32_t& e);
  CBC_QRAlignmentPattern* HandlePossibleCenter(const CFX_Int32Array& stateCount,
                                               int32_t i,
                                               int32_t j);
  static FX_FLOAT CenterFromEnd(const CFX_Int32Array& stateCount, int32_t end);

 private:
  CBC_CommonBitMatrix* m_image;
  CFX_ArrayTemplate<CBC_QRAlignmentPattern*> m_possibleCenters;
  int32_t m_startX;
  int32_t m_startY;
  int32_t m_width;
  int32_t m_height;
  FX_FLOAT m_moduleSize;
  CFX_Int32Array m_crossCheckStateCount;
};

#endif  // XFA_FXBARCODE_QRCODE_BC_QRALIGNMENTPATTERNFINDER_H_
