// 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_QRDETECTOR_H_
#define _BC_QRDETECTOR_H_
class CBC_ResultPoint;
class CBC_CommonBitMatrix;
class CBC_QRDetectorResult;
class CBC_QRFinderPatternInfo;
class CBC_QRAlignmentPattern;
class CBC_QRFinderPatternFinder;
class CBC_QRCoderVersion;
class CBC_QRGridSampler;
class CBC_QRAlignmentPatternFinder;
class CBC_QRAlignmentPattern;
class CBC_QRDetector;
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
