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_
9 class CBC_CommonBitMatrix;
10 class CBC_QRFinderPattern;
11 class CBC_ResultPoint;
12 class CBC_QRFinderPatternInfo;
13 
14 class 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