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_PDF417SCANNINGDECODER_H_
8 #define _BC_PDF417SCANNINGDECODER_H_
9 class CBC_CommonDecoderResult;
10 class CBC_CommonBitMatrix;
11 class CBC_ErrorCorrection;
12 class CBC_Codeword;
13 class CBC_BoundingBox;
14 class CBC_ResultPoint;
15 class CBC_BarcodeMetadata;
16 class CBC_BarcodeValue;
17 class CBC_DetectionResult;
18 class CBC_DetectionResultRowIndicatorColumn;
19 
20 class CBC_PDF417ScanningDecoder {
21  public:
22   CBC_PDF417ScanningDecoder();
23   virtual ~CBC_PDF417ScanningDecoder();
24   static void Initialize();
25   static void Finalize();
26   static CBC_CommonDecoderResult* decode(CBC_CommonBitMatrix* image,
27                                          CBC_ResultPoint* imageTopLeft,
28                                          CBC_ResultPoint* imageBottomLeft,
29                                          CBC_ResultPoint* imageTopRight,
30                                          CBC_ResultPoint* imageBottomRight,
31                                          int32_t minCodewordWidth,
32                                          int32_t maxCodewordWidth,
33                                          int32_t& e);
34   static CFX_ByteString toString(CFX_PtrArray* barcodeMatrix);
35 
36  private:
37   static int32_t CODEWORD_SKEW_SIZE;
38   static int32_t MAX_ERRORS;
39   static int32_t MAX_EC_CODEWORDS;
40   static CBC_PDF417ECErrorCorrection* errorCorrection;
41   static CBC_DetectionResult* merge(
42       CBC_DetectionResultRowIndicatorColumn* leftRowIndicatorColumn,
43       CBC_DetectionResultRowIndicatorColumn* rightRowIndicatorColumn,
44       int32_t& e);
45   static CBC_BoundingBox* adjustBoundingBox(
46       CBC_DetectionResultRowIndicatorColumn* rowIndicatorColumn,
47       int32_t& e);
48   static int32_t getMax(CFX_Int32Array& values);
49   static CBC_BarcodeMetadata* getBarcodeMetadata(
50       CBC_DetectionResultRowIndicatorColumn* leftRowIndicatorColumn,
51       CBC_DetectionResultRowIndicatorColumn* rightRowIndicatorColumn);
52   static CBC_DetectionResultRowIndicatorColumn* getRowIndicatorColumn(
53       CBC_CommonBitMatrix* image,
54       CBC_BoundingBox* boundingBox,
55       CBC_ResultPoint startPoint,
56       FX_BOOL leftToRight,
57       int32_t minCodewordWidth,
58       int32_t maxCodewordWidth);
59   static void adjustCodewordCount(CBC_DetectionResult* detectionResult,
60                                   CFX_PtrArray* barcodeMatrix,
61                                   int32_t& e);
62   static CBC_CommonDecoderResult* createDecoderResult(
63       CBC_DetectionResult* detectionResult,
64       int32_t& e);
65   static CBC_CommonDecoderResult* createDecoderResultFromAmbiguousValues(
66       int32_t ecLevel,
67       CFX_Int32Array& codewords,
68       CFX_Int32Array& erasureArray,
69       CFX_Int32Array& ambiguousIndexes,
70       CFX_PtrArray& ambiguousIndexValues,
71       int32_t& e);
72   static CFX_PtrArray* createBarcodeMatrix(
73       CBC_DetectionResult* detectionResult);
74   static FX_BOOL isValidBarcodeColumn(CBC_DetectionResult* detectionResult,
75                                       int32_t barcodeColumn);
76   static int32_t getStartColumn(CBC_DetectionResult* detectionResult,
77                                 int32_t barcodeColumn,
78                                 int32_t imageRow,
79                                 FX_BOOL leftToRight);
80   static CBC_Codeword* detectCodeword(CBC_CommonBitMatrix* image,
81                                       int32_t minColumn,
82                                       int32_t maxColumn,
83                                       FX_BOOL leftToRight,
84                                       int32_t startColumn,
85                                       int32_t imageRow,
86                                       int32_t minCodewordWidth,
87                                       int32_t maxCodewordWidth);
88   static CFX_Int32Array* getModuleBitCount(CBC_CommonBitMatrix* image,
89                                            int32_t minColumn,
90                                            int32_t maxColumn,
91                                            FX_BOOL leftToRight,
92                                            int32_t startColumn,
93                                            int32_t imageRow);
94   static int32_t getNumberOfECCodeWords(int32_t barcodeECLevel);
95   static int32_t adjustCodewordStartColumn(CBC_CommonBitMatrix* image,
96                                            int32_t minColumn,
97                                            int32_t maxColumn,
98                                            FX_BOOL leftToRight,
99                                            int32_t codewordStartColumn,
100                                            int32_t imageRow);
101   static FX_BOOL checkCodewordSkew(int32_t codewordSize,
102                                    int32_t minCodewordWidth,
103                                    int32_t maxCodewordWidth);
104   static CBC_CommonDecoderResult* decodeCodewords(CFX_Int32Array& codewords,
105                                                   int32_t ecLevel,
106                                                   CFX_Int32Array& erasures,
107                                                   int32_t& e);
108   static int32_t correctErrors(CFX_Int32Array& codewords,
109                                CFX_Int32Array& erasures,
110                                int32_t numECCodewords,
111                                int32_t& e);
112   static void verifyCodewordCount(CFX_Int32Array& codewords,
113                                   int32_t numECCodewords,
114                                   int32_t& e);
115   static CFX_Int32Array* getBitCountForCodeword(int32_t codeword);
116   static int32_t getCodewordBucketNumber(int32_t codeword);
117   static int32_t getCodewordBucketNumber(CFX_Int32Array& moduleBitCount);
118 };
119 #endif
120