1ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann// Copyright 2014 PDFium Authors. All rights reserved.
2ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann// Use of this source code is governed by a BSD-style license that can be
3ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann// found in the LICENSE file.
4ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
5ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
7ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#ifndef _BC_PDF417SCANNINGDECODER_H_
8ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define _BC_PDF417SCANNINGDECODER_H_
9ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannclass CBC_CommonDecoderResult;
10ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannclass CBC_CommonBitMatrix;
11ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannclass CBC_ErrorCorrection;
12ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannclass CBC_Codeword;
13ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannclass CBC_BoundingBox;
14ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannclass CBC_ResultPoint;
15ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannclass CBC_BarcodeMetadata;
16ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannclass CBC_BarcodeValue;
17ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannclass CBC_DetectionResult;
18ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannclass CBC_DetectionResultRowIndicatorColumn;
19ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
20ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannclass CBC_PDF417ScanningDecoder {
21ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann public:
22ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CBC_PDF417ScanningDecoder();
23ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  virtual ~CBC_PDF417ScanningDecoder();
24ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  static void Initialize();
25ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  static void Finalize();
26ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  static CBC_CommonDecoderResult* decode(CBC_CommonBitMatrix* image,
27ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                         CBC_ResultPoint* imageTopLeft,
28ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                         CBC_ResultPoint* imageBottomLeft,
29ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                         CBC_ResultPoint* imageTopRight,
30ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                         CBC_ResultPoint* imageBottomRight,
31ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                         int32_t minCodewordWidth,
32ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                         int32_t maxCodewordWidth,
33ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                         int32_t& e);
34ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  static CFX_ByteString toString(CFX_PtrArray* barcodeMatrix);
35ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
36ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann private:
37ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  static int32_t CODEWORD_SKEW_SIZE;
38ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  static int32_t MAX_ERRORS;
39ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  static int32_t MAX_EC_CODEWORDS;
40ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  static CBC_PDF417ECErrorCorrection* errorCorrection;
41ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  static CBC_DetectionResult* merge(
42ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      CBC_DetectionResultRowIndicatorColumn* leftRowIndicatorColumn,
43ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      CBC_DetectionResultRowIndicatorColumn* rightRowIndicatorColumn,
44ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      int32_t& e);
45ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  static CBC_BoundingBox* adjustBoundingBox(
46ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      CBC_DetectionResultRowIndicatorColumn* rowIndicatorColumn,
47ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      int32_t& e);
48ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  static int32_t getMax(CFX_Int32Array& values);
49ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  static CBC_BarcodeMetadata* getBarcodeMetadata(
50ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      CBC_DetectionResultRowIndicatorColumn* leftRowIndicatorColumn,
51ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      CBC_DetectionResultRowIndicatorColumn* rightRowIndicatorColumn);
52ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  static CBC_DetectionResultRowIndicatorColumn* getRowIndicatorColumn(
53ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      CBC_CommonBitMatrix* image,
54ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      CBC_BoundingBox* boundingBox,
55ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      CBC_ResultPoint startPoint,
56ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      FX_BOOL leftToRight,
57ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      int32_t minCodewordWidth,
58ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      int32_t maxCodewordWidth);
59ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  static void adjustCodewordCount(CBC_DetectionResult* detectionResult,
60ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                  CFX_PtrArray* barcodeMatrix,
61ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                  int32_t& e);
62ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  static CBC_CommonDecoderResult* createDecoderResult(
63ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      CBC_DetectionResult* detectionResult,
64ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      int32_t& e);
65ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  static CBC_CommonDecoderResult* createDecoderResultFromAmbiguousValues(
66ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      int32_t ecLevel,
67ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      CFX_Int32Array& codewords,
68ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      CFX_Int32Array& erasureArray,
69ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      CFX_Int32Array& ambiguousIndexes,
70ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      CFX_PtrArray& ambiguousIndexValues,
71ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      int32_t& e);
72ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  static CFX_PtrArray* createBarcodeMatrix(
73ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      CBC_DetectionResult* detectionResult);
74ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  static FX_BOOL isValidBarcodeColumn(CBC_DetectionResult* detectionResult,
75ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                      int32_t barcodeColumn);
76ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  static int32_t getStartColumn(CBC_DetectionResult* detectionResult,
77ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                int32_t barcodeColumn,
78ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                int32_t imageRow,
79ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                FX_BOOL leftToRight);
80ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  static CBC_Codeword* detectCodeword(CBC_CommonBitMatrix* image,
81ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                      int32_t minColumn,
82ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                      int32_t maxColumn,
83ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                      FX_BOOL leftToRight,
84ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                      int32_t startColumn,
85ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                      int32_t imageRow,
86ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                      int32_t minCodewordWidth,
87ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                      int32_t maxCodewordWidth);
88ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  static CFX_Int32Array* getModuleBitCount(CBC_CommonBitMatrix* image,
89ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                           int32_t minColumn,
90ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                           int32_t maxColumn,
91ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                           FX_BOOL leftToRight,
92ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                           int32_t startColumn,
93ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                           int32_t imageRow);
94ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  static int32_t getNumberOfECCodeWords(int32_t barcodeECLevel);
95ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  static int32_t adjustCodewordStartColumn(CBC_CommonBitMatrix* image,
96ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                           int32_t minColumn,
97ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                           int32_t maxColumn,
98ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                           FX_BOOL leftToRight,
99ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                           int32_t codewordStartColumn,
100ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                           int32_t imageRow);
101ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  static FX_BOOL checkCodewordSkew(int32_t codewordSize,
102ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                   int32_t minCodewordWidth,
103ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                   int32_t maxCodewordWidth);
104ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  static CBC_CommonDecoderResult* decodeCodewords(CFX_Int32Array& codewords,
105ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                                  int32_t ecLevel,
106ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                                  CFX_Int32Array& erasures,
107ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                                  int32_t& e);
108ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  static int32_t correctErrors(CFX_Int32Array& codewords,
109ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                               CFX_Int32Array& erasures,
110ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                               int32_t numECCodewords,
111ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                               int32_t& e);
112ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  static void verifyCodewordCount(CFX_Int32Array& codewords,
113ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                  int32_t numECCodewords,
114ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                  int32_t& e);
115ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  static CFX_Int32Array* getBitCountForCodeword(int32_t codeword);
116ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  static int32_t getCodewordBucketNumber(int32_t codeword);
117ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  static int32_t getCodewordBucketNumber(CFX_Int32Array& moduleBitCount);
118ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann};
119ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#endif
120