// 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_QRDETECTOR_H_
#define XFA_FXBARCODE_QRCODE_BC_QRDETECTOR_H_

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

class CBC_ResultPoint;
class CBC_CommonBitMatrix;
class CBC_QRDetectorResult;
class CBC_QRFinderPatternInfo;
class CBC_QRAlignmentPattern;

class CBC_QRDetector {
 private:
  CBC_CommonBitMatrix* m_image;

 public:
  CBC_QRDetector(CBC_CommonBitMatrix* image);
  virtual ~CBC_QRDetector();

  CBC_CommonBitMatrix* GetImage();
  CBC_QRDetectorResult* Detect(int32_t hints, int32_t& e);
  CBC_QRDetectorResult* ProcessFinderPatternInfo(CBC_QRFinderPatternInfo* info,
                                                 int32_t& e);
  FX_FLOAT CalculateModuleSize(CBC_ResultPoint* topLeft,
                               CBC_ResultPoint* topRight,
                               CBC_ResultPoint* bottomLeft);
  FX_FLOAT CalculateModuleSizeOneWay(CBC_ResultPoint* pattern,
                                     CBC_ResultPoint* otherPattern);
  FX_FLOAT SizeOfBlackWhiteBlackRunBothWays(int32_t fromX,
                                            int32_t fromY,
                                            int32_t toX,
                                            int32_t toY);
  FX_FLOAT SizeOfBlackWhiteBlackRun(int32_t fromX,
                                    int32_t fromY,
                                    int32_t toX,
                                    int32_t toY);
  CBC_QRAlignmentPattern* FindAlignmentInRegion(FX_FLOAT overallEstModuleSize,
                                                int32_t estAlignmentX,
                                                int32_t estAlignmentY,
                                                FX_FLOAT allowanceFactor,
                                                int32_t& e);
  static int32_t Round(FX_FLOAT d);
  static int32_t ComputeDimension(CBC_ResultPoint* topLeft,
                                  CBC_ResultPoint* topRight,
                                  CBC_ResultPoint* bottomLeft,
                                  FX_FLOAT moduleSize,
                                  int32_t& e);
  static CBC_CommonBitMatrix* SampleGrid(CBC_CommonBitMatrix* image,
                                         CBC_ResultPoint* topLeft,
                                         CBC_ResultPoint* topRight,
                                         CBC_ResultPoint* bottomLeft,
                                         CBC_ResultPoint* alignmentPattern,
                                         int32_t dimension,
                                         int32_t& e);
};

#endif  // XFA_FXBARCODE_QRCODE_BC_QRDETECTOR_H_
