1// Copyright 2014 PDFium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6
7#ifndef _BC_QRFINDERPATTERNFINDER_H_
8#define _BC_QRFINDERPATTERNFINDER_H_
9class CBC_CommonBitMatrix;
10class CBC_QRFinderPattern;
11class CBC_ResultPoint;
12class CBC_QRFinderPatternInfo;
13
14class CBC_QRFinderPatternFinder {
15 private:
16  const static int32_t CENTER_QUORUM;
17  const static int32_t MIN_SKIP;
18  const static int32_t MAX_MODULES;
19  const static int32_t INTEGER_MATH_SHIFT;
20  FX_BOOL m_hasSkipped;
21  CBC_CommonBitMatrix* m_image;
22  CFX_Int32Array m_crossCheckStateCount;
23  CFX_PtrArray m_possibleCenters;
24
25 public:
26  CBC_QRFinderPatternFinder(CBC_CommonBitMatrix* image);
27  virtual ~CBC_QRFinderPatternFinder();
28  int32_t FindRowSkip();
29  CBC_CommonBitMatrix* GetImage();
30  CBC_QRFinderPatternInfo* Find(int32_t hint, int32_t& e);
31
32  CFX_Int32Array& GetCrossCheckStateCount();
33  CFX_PtrArray* GetPossibleCenters();
34  CFX_PtrArray* SelectBestpatterns(int32_t& e);
35
36  FX_BOOL HandlePossibleCenter(const CFX_Int32Array& stateCount,
37                               int32_t i,
38                               int32_t j);
39  FX_BOOL HaveMultiplyConfirmedCenters();
40  FX_FLOAT CenterFromEnd(const CFX_Int32Array& stateCount, int32_t end);
41  FX_FLOAT CrossCheckVertical(int32_t startI,
42                              int32_t centerJ,
43                              int32_t maxCount,
44                              int32_t originalStateCountTotal);
45  FX_FLOAT CrossCheckHorizontal(int32_t startJ,
46                                int32_t CenterI,
47                                int32_t maxCOunt,
48                                int32_t originalStateCountTotal);
49  static void OrderBestPatterns(CFX_PtrArray* patterns);
50  static FX_BOOL FoundPatternCross(const CFX_Int32Array& stateCount);
51  static FX_FLOAT Distance(CBC_ResultPoint* point1, CBC_ResultPoint* point2);
52};
53#endif
54